@Pattern.List的JavaBean验证与XSD验证
使用KrasaJAXB工具jaxb插件,我生成了以下内容:@Pattern.List的JavaBean验证与XSD验证,java,validation,xsd,bean-validation,Java,Validation,Xsd,Bean Validation,使用KrasaJAXB工具jaxb插件,我生成了以下内容: 从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}"/
从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>
默认验证程序(提供程序为Apache):
使用JAXB,我成功地生成了有效的XML(它通过了XSD验证——包括上述字符串的格式)。
但如果我尝试使用Bean验证来验证上面提到的字符串,它会抛出错误——如果它写为“small123”,它会说它应该大写(如果是SMALL.123[A-Za-z0-9.]{0,27}regex),反之亦然。
结论是XSD验证将模式列表视为逻辑的或隐含的,而bean验证将其视为逻辑的和 因为这个事件在我的代码中只发生过一次,所以我设法修复了它(又快又脏),但我想知道是否有更好的方法
这是插件(生成了错误的注释)、验证器或其他东西(我没有注意到)的问题吗?是的,问题出在插件上 看这里 (固定并合并在1.5中) 这里呢 如果您不使用1.5,更新可能会修复您的问题。 在其他情况下,您必须等待54号问题的合并和发布,或者在本地回购中应用此修复
@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;
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
this.validator = factory.getValidator();