validacion - validar formulario javascript html5
JAXB, cómo validar el campo obligatorio y no obligatorio al desasignar (2)
Debe usar el esquema para validar. JAXB no puede hacer la validación por sí mismo.
SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(ClassUtils.getDefaultClassLoader().getResource(schemaPath));
unmarshaller.setSchema(schema);
Tengo un pequeño problema con JAXB, pero lamentablemente no pude encontrar la respuesta.
Tengo un cliente de clase, con 2 campos nombre y ciudad , el mapeo se hace usando anotaciones y ambos campos están marcados como obligatorios y no son anulables.
@XmlRootElement(name = "customer")
public class Customer {
enum City {
PARIS, LONDON, WARSAW
}
@XmlElement(name = "name", required = true, nillable = false)
public String name;
@XmlElement(name = "city", required = true, nillable = false)
public City city;
@Override
public String toString(){
return String.format("Name %s, city %s", name, city);
}
}
Sin embargo, cuando presento dicho archivo XML:
<customer>
<city>UNKNOWN</city>
</customer>
Recibiré una instancia de Cliente con ambos campos configurados en nulo.
¿No debería haber una excepción de validación o me falta algo en el mapeo?
Para desempatar yo uso:
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Customer customer = (Customer) unmarshaller.unmarshal(in);
Puede generar automágicamente esquema en tiempo de ejecución y usarlo para validación. Esto hará el trabajo:
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
generateAndSetSchema(unmarshaller);
Customer customer = (Customer) unmarshaller.unmarshal(in);
private void generateAndSetSchema(Unmarshaller unmarshaller) {
// generate schema
ByteArrayStreamOutputResolver schemaOutput = new ByteArrayStreamOutputResolver();
jaxbContext.generateSchema(schemaOutput);
// load schema
ByteArrayInputStream schemaInputStream = new ByteArrayInputStream(schemaOutput.getSchemaContent());
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new StreamSource(schemaInputStream));
// set schema on unmarshaller
unmarshaller.setSchema(schema);
}
private class ByteArrayStreamOutputResolver extends SchemaOutputResolver {
private ByteArrayOutputStream schemaOutputStream;
public Result createOutput(String namespaceURI, String suggestedFileName) throws IOException {
schemaOutputStream = new ByteArrayOutputStream(INITIAL_SCHEMA_BUFFER_SIZE);
StreamResult result = new StreamResult(schemaOutputStream);
// We generate single XSD, so generator will not use systemId property
// Nevertheless, it validates if it''s not null.
result.setSystemId("");
return result;
}
public byte[] getSchemaContent() {
return schemaOutputStream.toByteArray();
}
}