2012-06-18 25 views
5

Ich habe einige Klassen mit JAXB Annotationen, ich habe einige Instanzen erstellt und ich muss sie gegen meine XSD-Dateien validieren. Ich sollte in der Lage sein, Details darüber zu bekommen, was falsch ist, wenn die Objekte ungültig sind.Wie bekomme ich Fehlerdetails vom JAXB Validator?

Bisher hatte ich kein Glück, ich weiß über diese Klasse ValidationEventHandler, aber apperently kann ich es mit der Unmarshaller-Klasse verwenden, das Problem ist, dass ich die Objekte nicht das rohe XML validieren muss.

Ich habe diesen Code:

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

Dieser Code funktioniert, wird es das Objekt validieren und eine Ausnahme mit der Meldung, so etwas wie diese werfen:

cvc-Muster-gültig: Value '12345678901' ist nicht facetten gültig bezüglich auf Muster '\ d {10} Typ 'id'.]

Das Problem ist, dass ich bestimmte brauchen Details, mit einer solchen Zeichenfolge müsste ich alle Nachrichten analysieren.

+0

Eine mögliche Option besteht hier: http://stackoverflow.com/questions/11921190/how-to-get-the- element-of-invalid-xml-file-with-failed-xsd-validation –

+0

Ein weiterer Gruss gefunden, der zeigt, wie man das eigentlich ungültige DOM-Element bekommt http://stackoverflow.com/questions/8077437/how-can- Ich-bekomme-mehr-Informationen-auf-a n-invalid-dom-element-durch-die-validator # antwort-8162185 –

Antwort

0

Sie können eine Instanz von ErrorHandler auf der Validator setzen individuelle Fehler zu fangen:

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

MyErrorHandler

Unten finden Sie eine Beispielimplementierung der ErrorHandler Schnittstelle. Wenn Sie die Ausnahme nicht erneut auslösen, wird die Validierung fortgesetzt.

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

} 

Weitere Informationen

+2

Hi @blaise Das einzige Problem, das ich mit diesem Ansatz habe, ist, dass alles, was ich bekomme, eine Zeichenfolge mit allen Details wie "cvc-pattern-valid: Der Wert '12345678901' ist in Bezug auf das Muster '\ d {10}' für den Typ 'id' nicht facettengültig.] "... Da ich wissen muss, welches spezifische Element falsch ist, habe ich keine andere Option, als die Zeichenfolge zu analysieren – Rodrigo

Verwandte Themen