我有一个 maven 项目 A ,使用的是 javax.validation ,主要用于接口参数校验,并且 deploy 到 maven 公共仓库上了;
现在我有一个项目 B 依赖了 A ,用的是 java17 和 springboot3,用的是 jakarta.validation ,发现即使在 B 里把 jakarta.validation 替换成 javax.validation ,但是接口参数校验并不生效;
谷歌了下也没有查到解决方案(不能把项目 A 替换成 jakarta.validation ,因为有其他 springboot2.x 的项目有在使用,有没有什么并行的方法?)
1
vvtf 2023-09-19 16:18:55 +08:00
手动校验呗.
https://stackoverflow.com/questions/19190592/manually-call-spring-annotation-validation 基于上述方法可以+`AOP`自动实现. |
2
sujin190 2023-09-19 16:25:26 +08:00 via Android
不知道在 B 里添加 javax 包,添加相同注解继承自 jakarta 的注解行不行
|
3
zshineee OP |
5
sujin190 2023-09-19 16:47:53 +08:00 via Android
@zshineee 就是建一个相同名称注解继承自 jakarta 里相同名称的注解呗,猜想 spring 扫描注解是通过 instanceof 来判断是不是某个类型注解来处理流程吧,不知道这样行不行
|
6
BiChengfei 2023-09-19 16:51:40 +08:00
升级 A 项目版本并且发包,旧版本接着用 javax.validation ,新版本用 jakarta.validation
|
7
bugmakerxs 2023-09-19 17:06:26 +08:00
项目 A 升级版本呗,两版本并行,每次一起维护。
|
8
Leon406 2023-09-19 17:08:15 +08:00
个人看法,仅供参考
1.单独升级或者新出一个库 A maven 依赖库, 所有改为 jakarta EE 9+ 命名空间依赖 2. 如果 A 升级不了的话,降级 SpringBoot 到 2.7.x 也行 3. 字节码修改方案, 看有没有现成的插件, 没有的话自己手动修改 jar 包也行 java EE 标准由 web 容器决定, SpringBoot 默认容器是 tomcat https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide |
9
vvtf 2023-09-19 17:16:09 +08:00
@zshineee
@sujin190 #5 的意思是在`B`依赖`A`时, `exclude javax.validation` 的包. 然后再`B`项目创建` javax.validation `相同类路径的注解, 然后使用`jakarta.validation `注解. 比如: ```java package javax.validation.constraints; @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) @Repeatable(List.class) @Documented @Constraint(validatedBy = { }) // 这里用 jakarta 的注解 @jakarta.validation.constraints.NotNull public @interface NotNull { // ignore. } ``` |
10
mgzu 2023-09-19 17:24:03 +08:00
拉个分支,用大版本区分吧
|
12
zshineee OP 感觉还是分版本并行维护比较好
|