2012-06-18 16 views
5

Mam kilka klas z adnotacjami JAXB, stworzyłem kilka wystąpień i muszę je zweryfikować w stosunku do moich plików XSD. Powinienem być w stanie uzyskać szczegółowe informacje o tym, co jest nie tak, gdy obiekty są nieważne.Jak uzyskać szczegółowe informacje o błędach z JAXB Validator?

Do tej pory nie miałem szczęścia, wiem o tej klasie ValidationEventHandler ale apperantly mogę go używać z klasą Unmarshaller, problem polega na tym, że muszę zweryfikować obiekty, a nie surowy XML.

mam ten kod:

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

Ten kod będzie działał, to zatwierdzić obiekt, a wyjątek z komunikatem, coś takiego:

CVC-pattern-valid: wartość „12345678901” nie jest ważny aspekt, w odniesieniu do wzoru „\ D {10}” dla typu „ID”.]

problemem jest to, że muszą specyficzne szczegóły, z takim ciągiem, musiałbym przeanalizować wszystkie wiadomości.

+0

Jedną z możliwych opcji istnieje tutaj: http://stackoverflow.com/questions/11921190/how-to-get-the- element-of-and-invalid-xml-file-with-failed-xsd-validation –

+0

Znaleźliśmy kolejną awnser, która pokazuje, jak uzyskać aktualny nieprawidłowy element DOM http://stackoverflow.com/questions/8077437/how-can- i-get-more-information-on-a n-invalid-dom-element-through-the-validator # answer-8162185 –

Odpowiedz

0

Można ustawić instancję ErrorHandler na Validator złapać indywidualne błędy:

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

MyErrorHandler

Poniżej znajduje się przykładowy implementacja interfejsu ErrorHandler. Jeśli nie powtórzysz wyjątku, sprawdzanie poprawności będzie kontynuowane.

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

} 

Aby uzyskać więcej informacji

+2

Hi @blaise Jedynym problemem jaki mam z tym podejściem jest to, że otrzymuję tylko ciąg z wszystkimi szczegółami, takimi jak "wzór-cvc: Wartość "12345678901" nie jest poprawna w odniesieniu do wzorca "\ d {10}" dla typu "id".] "... Ponieważ muszę wiedzieć, jaki konkretny element jest nieprawidłowy, nie mam innej opcji, ale sparsować ciąg – Rodrigo