Поддерживает ли 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, но не уверен.
Ответы
Ответ 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;
}