web-dev-qa-db-ja.com

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クライアントスタブジェネレーターがこれを実行しているのを見たことがありますが、おそらくaxis2Webサービスですが確かではありません。

21
Narendra Pathai

JAXB(JSR-222) 仕様は、ドメインモデルへのフェイルファストロジックの生成をカバーしていません。現在の一般的な方法は、検証ルールを注釈(またはXML)の形式で表現し、それらに対して検証を実行することです。 Bean Validation(JSR-303) これを標準化し、任意のJava EE 6実装。

XJC拡張機能

私は次の拡張機能を自分で試していませんが、 Bean Validation(JSR-303) アノテーションを生成するように見えますXMLスキーマからのドメインモデル表現検証ルール。 XJCは非常に拡張性が高いため、他のプラグインも利用できる場合があります。

21
bdoughan

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;

}
5
vbence

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