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

时间:2016-10-04 09:29:40

标签: 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;

默认验证器(提供者是Apache):

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

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

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

由于此事件在我的代码中只发生过一次,我设法修复它(快速和脏),但我想知道是否有更好的方法。

这是插件(生成错误的注释),验证器或其他东西(我没注意到)的问题吗?

1 个答案:

答案 0 :(得分:1)

是问题与插件有关。

见这里 https://github.com/krasa/krasa-jaxb-tools/issues/41(已修复并合并为1.5) 和这里 https://github.com/krasa/krasa-jaxb-tools/issues/54

如果您没有使用1.5,可能更新修复了您的问题。 在其他情况下,您必须等待问题54的合并和发布,或者在本地仓库中应用此修复。