请教一个 javax.validation 和 jakarta.validation 的问题

240 天前
 zshineee

我有一个 maven 项目 A ,使用的是 javax.validation ,主要用于接口参数校验,并且 deploy 到 maven 公共仓库上了;

现在我有一个项目 B 依赖了 A ,用的是 java17 和 springboot3,用的是 jakarta.validation ,发现即使在 B 里把 jakarta.validation 替换成 javax.validation ,但是接口参数校验并不生效;

谷歌了下也没有查到解决方案(不能把项目 A 替换成 jakarta.validation ,因为有其他 springboot2.x 的项目有在使用,有没有什么并行的方法?)

752 次点击
所在节点    程序员
12 条回复
vvtf
240 天前
手动校验呗.
https://stackoverflow.com/questions/19190592/manually-call-spring-annotation-validation
基于上述方法可以+`AOP`自动实现.
sujin190
240 天前
不知道在 B 里添加 javax 包,添加相同注解继承自 jakarta 的注解行不行
zshineee
240 天前
@vvtf 好像跟我的需求不太一样,因为这个公共包写的是自定义的注解,类似 @NotNull,@Size,@Max 这样的一个集合
zshineee
240 天前
@sujin190 这个继承自 jakarta 怎么操作
sujin190
239 天前
@zshineee 就是建一个相同名称注解继承自 jakarta 里相同名称的注解呗,猜想 spring 扫描注解是通过 instanceof 来判断是不是某个类型注解来处理流程吧,不知道这样行不行
BiChengfei
239 天前
升级 A 项目版本并且发包,旧版本接着用 javax.validation ,新版本用 jakarta.validation
bugmakerxs
239 天前
项目 A 升级版本呗,两版本并行,每次一起维护。
Leon406
239 天前
个人看法,仅供参考
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
vvtf
239 天前
@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.
}
```
mgzu
239 天前
拉个分支,用大版本区分吧
zshineee
239 天前
@vvtf 确实也是一种方法
zshineee
239 天前
感觉还是分版本并行维护比较好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/975228

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX