-->

是否JAXB支持的xsd:限制?(Does JAXB support xsd:restriction

2019-06-21 19:14发布

<xs:element name="age">
  <xs:simpleType>
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="120"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

所以,我想让它变得转换为这样的Java代码:

public void setAge(int age){
    if(age < 0 || age > 120){
         //throw some exception
    }
     //setting the age as it is a valid value
}

是否有可能在JAXB?

曾经看过一些WebService的客户端存根生成器这样做也许Axis2的web服务,但不能确定。

Answer 1:

JAXB(JSR-222)规范不包括生成快速失败逻辑到域模型。 现在通常的做法是,以表达注释(或XML)的形式验证规则并在其上运行的验证。 Bean验证(JSR-303)标准化这一点,可在任何Java EE 6实现。

XJC扩展

我还没有尝试以下扩展自己,但它看起来好像它会产生Bean验证(JSR-303)批注到从XML架构域模型表示的验证规则。 由于XJC是非常可扩展可能有其他的插件可用。

  • http://code.google.com/p/krasa-jaxb-tools/


Answer 2:

建议的方式来执行此验证的JAXB是在编组RESP的模式验证切换。 解组:

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = schemaFactory.newSchema(...);

ValidationEventHandler valHandler = new ValidationEventHandler() {
  public boolean handleEvent(ValidationEvent event) {
      ...
  }
};

marshaller.setSchema(schema);
marshaller.setEventHandler(valHandler);


Answer 3:

您可以尝试JAXB刻面 。 快速片段:

class MyClass {

    @MinOccurs(1) @MaxOccurs(10)
    @Facets(minInclusive=-100, maxInclusive=100)
    public List<Integer> value;

    @Facets(pattern="[a-z][a-z0-9]{0,4}")
    public String name;

}


文章来源: Does JAXB support xsd:restriction?