2012-06-18 27 views
5

Tôi có một số lớp học với chú thích JAXB, tôi đã tạo một số trường hợp và tôi cần phải xác thực chúng đối với các tệp XSD của tôi. Tôi sẽ có thể nhận được các chi tiết của những gì là sai khi các đối tượng không hợp lệ.Cách nhận chi tiết lỗi từ Trình xác thực JAXB?

Cho đến nay tôi chưa có may mắn, tôi biết về lớp ValidationEventHandler nhưng tôi có thể sử dụng nó một cách hiệu quả với lớp Unmarshaller, vấn đề là tôi phải xác thực các đối tượng không phải là XML thô.

tôi có mã này:

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

Mã này sẽ làm việc, nó sẽ xác nhận đối tượng và ném một ngoại lệ với thông điệp, một cái gì đó như thế này:

cvc-mẫu-hợp lệ: Giá trị '12345678901' không có hiệu lực theo khía cạnh tôn trọng đối với mẫu '\ d {10}' đối với loại 'id'.]

Vấn đề là tôi cần cụ thể chi tiết, với một chuỗi như vậy tôi sẽ phải phân tích tất cả các tin nhắn.

+0

Một lựa chọn có thể tồn tại ở đây: http://stackoverflow.com/questions/11921190/how-to-get-the- yếu tố-of-và-invalid-xml-file-với-thất bại-xsd-xác nhận –

+0

Tìm thấy awnser khác cho bạn thấy làm thế nào để có được phần tử DOM không hợp lệ thực tế http://stackoverflow.com/questions/8077437/how-can- i-get-more-information-on-a n-invalid-dom-element-through-the-validator # answer-8162185 –

Trả lời

0

Bạn có thể thiết lập một thể hiện của ErrorHandler trên Validator để bắt lỗi cá nhân:

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

MyErrorHandler

Dưới đây là một việc thực hiện mẫu giao diện ErrorHandler. Nếu bạn không rethrow ngoại lệ, việc xác nhận sẽ tiếp tục.

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

} 

Để biết thêm thông tin

+2

Xin chào @blaise Vấn đề duy nhất tôi có với phương pháp này là tất cả những gì tôi nhận được là một chuỗi với tất cả các chi tiết như "cvc-pattern-valid: Giá trị '12345678901' không phải là khía cạnh hợp lệ đối với mẫu '\ d {10}' cho loại 'id'.] "... Vì tôi cần biết yếu tố cụ thể nào sai, tôi không có tùy chọn nào khác ngoài phân tích chuỗi – Rodrigo

Các vấn đề liên quan