V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zshineee
V2EX  ›  程序员

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

  •  
  •   zshineee · 2023-09-19 16:03:53 +08:00 · 988 次点击
    这是一个创建于 429 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    vvtf
        1
    vvtf  
       2023-09-19 16:18:55 +08:00
    手动校验呗.
    https://stackoverflow.com/questions/19190592/manually-call-spring-annotation-validation
    基于上述方法可以+`AOP`自动实现.
    sujin190
        2
    sujin190  
       2023-09-19 16:25:26 +08:00 via Android
    不知道在 B 里添加 javax 包,添加相同注解继承自 jakarta 的注解行不行
    zshineee
        3
    zshineee  
    OP
       2023-09-19 16:27:06 +08:00
    @vvtf 好像跟我的需求不太一样,因为这个公共包写的是自定义的注解,类似 @NotNull,@Size,@Max 这样的一个集合
    zshineee
        4
    zshineee  
    OP
       2023-09-19 16:36:27 +08:00
    @sujin190 这个继承自 jakarta 怎么操作
    sujin190
        5
    sujin190  
       2023-09-19 16:47:53 +08:00 via Android
    @zshineee 就是建一个相同名称注解继承自 jakarta 里相同名称的注解呗,猜想 spring 扫描注解是通过 instanceof 来判断是不是某个类型注解来处理流程吧,不知道这样行不行
    BiChengfei
        6
    BiChengfei  
       2023-09-19 16:51:40 +08:00
    升级 A 项目版本并且发包,旧版本接着用 javax.validation ,新版本用 jakarta.validation
    bugmakerxs
        7
    bugmakerxs  
       2023-09-19 17:06:26 +08:00
    项目 A 升级版本呗,两版本并行,每次一起维护。
    Leon406
        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
    vvtf
        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.
    }
    ```
    mgzu
        10
    mgzu  
       2023-09-19 17:24:03 +08:00
    拉个分支,用大版本区分吧
    zshineee
        11
    zshineee  
    OP
       2023-09-19 18:24:52 +08:00
    @vvtf 确实也是一种方法
    zshineee
        12
    zshineee  
    OP
       2023-09-19 18:25:29 +08:00
    感觉还是分版本并行维护比较好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1007 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:14 · PVG 04:14 · LAX 12:14 · JFK 15:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.