java - example - ¿JAXB admite xsd: restricción?
web service java netbeans (3)
La especificación JAXB (JSR-222) no cubre la generación de lógica de falla rápida en el modelo de dominio. Una práctica común ahora es expresar reglas de validación en forma de anotaciones (o XML) y ejecutar la validación en ellas. Bean Validation (JSR-303) lo estandariza y está disponible en cualquier implementación de Java EE 6.
Extensiones XJC
No he intentado la siguiente extensión, pero parece que generará anotaciones de Bean Validation (JSR-303) en las reglas de validación de representación del modelo de dominio del esquema XML. Como XJC es muy extensible, puede haber otros complementos disponibles también.
<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>
Así que quiero que se convierta en un código Java como este:
public void setAge(int age){
if(age < 0 || age > 120){
//throw some exception
}
//setting the age as it is a valid value
}
¿Es posible en JAXB?
Había visto un generador de strees de WebService Client haciendo esto, tal vez el servicio web axis2, pero no estoy seguro.
La forma sugerida para realizar esta validación en JAXB es activar la validación de esquema en el marcador de referencias. 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);
Puedes probar JAXB-Facets . Fragmento rápido:
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;
}