Подтвердить что ты не робот

Поддерживает ли JAXB xsd: ограничение?

<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, но не уверен.

4b9b3361

Ответ 1

Спецификация JAXB (JSR-222) не охватывает генерацию сбоя быстрой логики в модели домена. В настоящее время распространенная практика заключается в том, чтобы выражать правила проверки в форме аннотаций (или XML) и запускать проверку на них. Bean Validation (JSR-303) стандартизирует это и доступен в любой реализации Java EE 6.

Расширения XJC

Я не пробовал следующее расширение сам, но кажется, что он будет генерировать Bean Validation (JSR-303) аннотации к правилам проверки представления модели модели домена из схемы XML. Поскольку XJC является очень расширяемым, могут быть доступны и другие плагины.

Ответ 2

Предлагаемый способ выполнения этой проверки в JAXB - это включение проверки схемы на маршаллере соответственно. 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);

Ответ 3

Вы можете попробовать 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;

}