2010-07-25 11 views
5
  1. Escribí algunas clases de Java y las anoté con las anotaciones de JAXB.
  2. Después de eso utilicé schemagen para generar un xsd.
  3. Luego construyo un gráfico de objetos y lo organizo en un archivo xml.
  4. Modifiqué el archivo xml para que ya no fuera válido.

Quería usar el xsd con la esperanza de que el unmarshalling de JAXB falle. Pero no es así ¿Por qué?¿Por qué JAXB no quiere validar

JAXB está leyendo un esquema (si el XML del esquema es incorrecto, JAXB da una excepción), pero parece que JAXB está ignorando el esquema durante la lectura.

SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = sf.newSchema(getClass().getResource("/schema1.xsd")); 
JAXBContext context = JAXBContext.newInstance(Customer.class); 
Unmarshaller unmarshaller = context.createUnmarshaller(); 
unmarshaller.setSchema(schema); 

Customer c = JAXB.unmarshal(file, Customer.class); 

El XML escrito comienza así:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:customer xmlns:ns2="http://bla.com/"> 

Incluso el ValidationEventCollector adjunta no dio ninguna información:

unmarshaller.setEventHandler(new JAXBEventCollector()); 

JAXBEventCollector es:

class JAXBEventCollector extends ValidationEventCollector 
{ 
    @Override 
    public boolean handleEvent(ValidationEvent event) 
    { 
     System.out.println(event.getLocator()); 
     return true; 
    } 
} 
+0

duplicado: http://stackoverflow.com/questions/805989/can -one-validate-marshalled-xml-with-jaxb-2-0 – lexicore

+0

Por supuesto que no. Por favor tómese el tiempo y lea ambas preguntas cuidadosamente. –

+0

según lexicore dupe exacto - votado para cerrar –

Respuesta

2

Su código debería d trabajo Un par de cosas a tener en cuenta:

  • ¿La URL de su esquema vuelve a ser nula?
  • Es su última línea un error tipográfico "JAXB.unmarshal (file, Customer.class)", o es JAXB otro unmarshaller sin un esquema establecido en él.

A continuación se muestra un fragmento de código que definitivamente arroja errores cuando no se utiliza el XML no válido. Este código funciona correctamente con las implementaciones MOXy y Metro (RI) JAXB.

public static void main(String[] args) throws Exception { 
    SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    File xsd = new File("customer.xsd"); 
    Schema schema = sf.newSchema(xsd); 
    JAXBContext context = JAXBContext.newInstance(Customer.class); 
    Unmarshaller unmarshaller = context.createUnmarshaller(); 
    unmarshaller.setSchema(schema); 

    FileInputStream xml = new FileInputStream("invalid.xml"); 
    unmarshaller.unmarshal(xml); 
} 

Con Metro el error se ve como:

Exception in thread "main" javax.xml.bind.UnmarshalException 
- with linked exception: 
[org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'phone-numbers'. One of '{phoneNumbers}' is expected.] 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:514) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:215) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:184) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:184) 
    at example.gettingstarted.Demo2.main(Demo2.java:23) 

Con moxy el error se ve como:

Exception in thread "main" javax.xml.bind.UnmarshalException 
- with linked exception: 
[Exception [EclipseLink-25004] (Eclipse Persistence Services - 2.0.3.qualifier): org.eclipse.persistence.exceptions.XMLMarshalException 
Exception Description: An error occurred unmarshalling the document 
Internal Exception: org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'phone-numbers'. One of '{phoneNumbers}' is expected.] 
    at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:114) 
    at example.gettingstarted.Demo2.main(Demo2.java:23) 
+1

Si la URL del Esquema sería incorrecta, habría una NullPointerException. Entonces este no es el error. Pero me has dirigido al error y podría golpear mi cabeza contra la pared. ¡Gracias! Usted hace mi día :) Por supuesto JAXB.unmarshal() no tiene el contexto, a la derecha es Cliente c = (Cliente) unmarshaller.unmarshal (archivo); –

+0

No hay problema, siéntase libre de votar o aceptar como la respuesta si ayuda :) –

Cuestiones relacionadas