@Pattern.List 的 Java bean 验证与 XSD 验证

标签 java validation xsd bean-validation

使用 krasa-jaxb-tools jaxb-plugin,我生成了以下内容:

来自 XSD 模式:

<xs:simpleType name="SomethingId">
    <xs:restriction base="xs:string">
        <xs:pattern value="small\.123[A-Za-z0-9\.]{0,27}"/>
        <xs:pattern value="SMALL\.123[A-Za-z0-9\.]{0,27}"/>
    </xs:restriction>
</xs:simpleType>

我得到了带注释的元素:

    @XmlElement(name = "SomethingId", required = true)
    @NotNull
    @Pattern.List({
    @Pattern(regexp = "small\\.123[A-Za-z0-9\\.]{0,27}"),
    @Pattern(regexp = "SMALL\\.123[A-Za-z0-9\\.]{0,27}")
})
protected String somethingId;

默认 validator (提供者是 Apache):

 ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        this.validator = factory.getValidator(); 

使用 JAXB,我成功生成了有效的 XML(它通过了 XSD 验证——包括上述字符串的格式)。
但是如果我尝试使用 Bean Validation 如上所述验证字符串,它会抛出错误 - 如果它被写为“small123”,它说它应该大写(失败 SMALL.123[A-Za-z0-9 .]{0,27} 正则表达式),反之亦然。

结论是 XSD 验证将模式列表视为隐含的逻辑 OR,而 bean 验证将它们视为逻辑 AND。

因为这个事件在我的代码中只发生过一次,所以我设法修复了它(又快又脏),但我想知道是否有更好的方法。

这是插件的问题(生成了错误的注解)、 validator 的问题还是其他问题(我没有注意到)?

最佳答案

是的,问题出在插件上。

看这里 https://github.com/krasa/krasa-jaxb-tools/issues/41 (在 1.5 中修复并合并) 和这里 https://github.com/krasa/krasa-jaxb-tools/issues/54

如果您使用的不是 1.5,也许更新可以解决您的问题。 在其他情况下,您必须等待问题 54 的合并和发布,或者在您的本地存储库中应用此修复。

关于@Pattern.List 的 Java bean 验证与 XSD 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39848768/

相关文章:

java - 如何自定义 Vitamio widget?

java - 什么时候字符串在Java中是不同的对象?

xml - 验证 SOAP 消息

python-3.x - 在设置值时验证 Pydantic 字段

XML 架构 - 如何更改引用元素的名称?

c# - 如何在引用另一个嵌入式 xsd 的嵌入式 xsd 中使用 include?

java - 如何从 XSD 获取所有 xpath?

JavaFX - MediaPlayer 不工作

java - 检测lambda是否是方法引用

javascript - 使用 jquery 表单验证进行密码验证 jquery.form-validator.js