2012-06-18 9 views
5

Tengo algunas clases con anotaciones JAXB, he creado algunas instancias y debo validarlas con mis archivos XSD. Debería poder obtener los detalles de lo que está mal cuando los objetos no son válidos.¿Cómo obtener detalles del error de JAXB Validator?

Hasta ahora no he tenido suerte, conozco esta clase ValidationEventHandler pero, por supuesto, puedo usarla con la clase Unmarshaller, el problema es que tengo que validar los objetos, no el XML sin formato.

tengo este código:

MyClass myObject = new MyClass(); 
JAXBContext jaxbContext = JAXBContext.newInstance("x.y.z"); 
JAXBSource jaxbSource = new JAXBSource(jaxbContext, myObject); 
SchemaFactory factory = SchemaFactory 
       .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Source schemaFile = new StreamSource(getClass().getClassLoader() 
       .getResourceAsStream("mySchema.xsd")); 
Schema schema = factory.newSchema(schemaFile); 

Validator validator = schema.newValidator(); 

validator.validate(jaxbSource); 

Este código va a funcionar, se validará el objeto y lanzar una excepción con el mensaje, algo como esto:

CVC-patrón-válido: valor '12345678901' no es válida faceta con respecto al patrón '\ d {10}' para el tipo 'id'.]

El problema es que necesito específica detalles, con una cadena así tendré que analizar todos los mensajes.

+0

Una posible opción existe aquí: http://stackoverflow.com/questions/11921190/how-to-get-the- elemento-de-y-inválido-xml-file-with-failed-xsd-validation –

+0

Encontré otro awnser que muestra cómo obtener el elemento DOM inválido real http://stackoverflow.com/questions/8077437/how-can- i-get-more-information-on-a n-invalid-dom-element-through-the-validator # answer-8162185 –

Respuesta

0

Puede configurar una instancia de ErrorHandler en el Validator para detectar errores individuales:

Validator validator = schema.newValidator(); 
    validator.setErrorHandler(new MyErrorHandler()); 
    validator.validate(source); 

MyErrorHandler

A continuación se muestra un ejemplo de implementación de la interfaz ErrorHandler. Si no vuelve a lanzar la excepción, la validación continuará.

import org.xml.sax.ErrorHandler; 
import org.xml.sax.SAXException; 
import org.xml.sax.SAXParseException; 

public class MyErrorHandler implements ErrorHandler { 

    public void warning(SAXParseException exception) throws SAXException { 
     System.out.println("\nWARNING"); 
     exception.printStackTrace(); 
    } 

    public void error(SAXParseException exception) throws SAXException { 
     System.out.println("\nERROR"); 
     exception.printStackTrace(); 
    } 

    public void fatalError(SAXParseException exception) throws SAXException { 
     System.out.println("\nFATAL ERROR"); 
     exception.printStackTrace(); 
    } 

} 

Para más información

+2

Hola @blaise El único problema que tengo con este enfoque es que todo lo que obtengo es una cadena con todos los detalles como "cvc-pattern-valid: El valor '12345678901' no tiene validez faceta con respecto al patrón '\ d {10}' para el tipo 'id'.] "... Como necesito saber qué elemento específico está mal, no tengo otra opción que analizar la cadena – Rodrigo

Cuestiones relacionadas