JAXB 是否支持 xsd:restriction?

<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 Webservice,但不确定。


答案 1

JAXB (JSR-222) 规范不涉及在域模型中生成快速故障逻辑。现在常见的做法是以批注(或 XML)的形式表示验证规则,并对其运行验证。Bean Validation (JSR-303) 对此进行了标准化,并且可用于任何 Java EE 6 实现。

XJC 扩展

我自己没有尝试过以下扩展,但它似乎会从XML模式生成Bean Validation(JSR-303)注释到域模型表示验证规则上。由于 XJC 非常具有可扩展性,因此可能还有其他插件可用。


答案 2

在 JAXB 中执行此验证的建议方法是在 marshaller resp. unmarshaller 上打开模式验证:

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);

推荐