2012-06-18 8 views
5

Ho alcune classi con annotazioni JAXB, ho creato alcune istanze e ho bisogno di convalidarle contro i miei file XSD. Dovrei essere in grado di ottenere i dettagli di ciò che è sbagliato quando gli oggetti non sono validi.Come ottenere i dettagli dell'errore dal validatore JAXB?

Finora non ho avuto fortuna, so di questa classe ValidationEventHandler ma in modo diffuso posso usarla con la classe Unmarshaller, il problema è che devo convalidare gli oggetti non il XML grezzo.

ho questo codice:

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

Questo codice funzionerà, sarà convalidare l'oggetto e generare un'eccezione con il messaggio, qualcosa di simile:

CVC-modello-valida: valore '12345678901' non è sfaccettato valido rispetto al modello '\ d {10}' per il tipo 'id'.]

Il problema è che ho bisogno specifico dettagli, con una stringa del genere dovrei analizzare tutti i messaggi.

+0

Una possibile opzione esiste qui: http://stackoverflow.com/questions/11921190/how-to-get-the- elemento-di-e-invalid-xml-file-with-failed-xsd-validation –

+0

Trovato un altro awnser che mostra come ottenere l'effettivo elemento DOM non valido http://stackoverflow.com/questions/8077437/how-can- i-get-more-informazioni-on-a n-invalid-dom-element-through-the-validator # answer-8162185 –

risposta

0

È possibile impostare un'istanza ErrorHandler sul Validator per catturare errori individuali:

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

MyErrorHandler

Di seguito è riportato un esempio di implementazione dell'interfaccia ErrorHandler. Se non si rilancia l'eccezione, la convalida continuerà.

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

} 

Per ulteriori informazioni

+2

Hi @blaise L'unico problema che ho con questo approccio è che tutto ciò che ottengo è una stringa con tutti i dettagli come "cvc-pattern-valid: Il valore '12345678901' non è facet-valid rispetto al modello '\ d {10}' per il tipo 'id'.] "... Poiché ho bisogno di sapere quale elemento specifico è sbagliato non ho altra opzione ma analizzare la stringa – Rodrigo

Problemi correlati