validar validacion vacios pattern funciona formularios formulario enviar ejemplos con campos antes java xml jaxb

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(); } }