21
<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 Client 存根生成器这样做可能是axis2 webservice,但不确定。

4

3 回答 3

21

JAXB (JSR-222)规范不包括在域模型中生成快速失败逻辑。现在的一种常见做法是以注释(或 XML)的形式表达验证规则并对其进行验证。 Bean Validation (JSR-303)对此进行了标准化,并可在任何 Java EE 6 实现中使用。

XJC 扩展

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

于 2012-12-12T11:46:27.567 回答
5

在 JAXB 中执行此验证的建议方法是在编组器上打开模式验证。解组器:

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);
于 2012-12-10T09:07:13.747 回答
5

您可以尝试JAXB-Facets。快速片段:

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;

}
于 2014-02-27T09:26:54.860 回答