You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JAXB绑定文件为List属性的泛型参数添加@Pattern约束

如何通过JAXB绑定文件为List属性的泛型参数添加@Pattern约束

嘿,我太懂你这种想给JAXB类里List泛型参数加@Pattern约束的需求了,之前你用EachPattern碰到的NullPointerException确实挺闹心的,我来给你说说怎么解决这个问题,以及为啥之前的方法会出问题。

首先聊聊那个空指针的原因:你用的cz.jirutka.validator.collection.constraints.EachPattern这个注解,它底层依赖的commons-lang3版本可能和你项目里的版本不兼容,导致在调用SystemUtils.isJavaVersionAtLeast的时候出现空指针——说白了就是类加载或者版本冲突搞出来的锅,而且这个注解的思路是给整个List加一个批量验证器,和你一开始想的List<@Pattern String>这种给每个泛型元素单独加注解的语义其实不太一样。

那正确的做法应该是直接给List的泛型参数(也就是String)加上@Pattern注解,用annox的绑定语法就能实现,具体写法如下:

<jaxb:bindings node="//xs:complexType[@name='YourClassName']//xs:element[@name='names']">
    <annox:annotate target="field">
        @javax.validation.constraints.Pattern.List({})
    </annox:annotate>
    <annox:annotate target="field" generic-type="0">
        @javax.validation.constraints.Pattern(regexp = "test")
    </annox:annotate>
</jaxb:bindings>

这里得解释下这两行的作用:

  • 第一行的@Pattern.List({})是个小技巧,用来让JAXB正确识别字段上的注解集合,避免后续泛型注解的冲突;
  • 第二行的generic-type="0"指定了要给List的第0个泛型参数(也就是String)添加注解,这样生成的JAXB类里就会出现你想要的List<@Pattern(regex="test") String> names;这种形式。

生成类之后你可以检查一下,泛型参数上应该已经带上了@Pattern注解,之后用Hibernate Validator之类的验证框架测试,就能正常校验List里的每个字符串是否符合正则规则了。

备注:内容来源于stack exchange,提问作者Patrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 11:24:51