2012-06-18 29 views
5

我有一些JAXB註釋類,我創建了一些實例,我需要驗證他們對我的XSD文件。當對象無效時,我應該能夠獲得有關錯誤的詳細信息。如何從JAXB Validator獲取錯誤細節?

到目前爲止,我還沒有運氣,我知道這個類ValidationEventHandler,但很明顯我可以將它與Unmarshaller類一起使用,問題是我必須驗證對象而不是原始XML。

我有這樣的代碼:

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

此代碼將工作,它會驗證對象,並拋出一個異常,並顯示消息是這樣的:

CVC圖案有效:值「12345678901」不是小面有效的相對於 到圖案「\ d {10}」類型的「id」。]

的問題是,我需要特定細節,像這樣的字符串,我將不得不解析所有的消息。

+0

一個可能的選項存在這裏:http://stackoverflow.com/questions/11921190/how-to-get-the-元素和無效的xml文件與失敗xsd驗證 –

+0

發現另一個awnser,告訴你如何得到實際無效的DOM元素http://stackoverflow.com/questions/8077437/how-can- I-GET-更多的信息上,一n-invalid-dom-element-through-validator#answer-8162185 –

回答

0

您可以設置ErrorHandlerValidator一個實例趕上個別錯誤:

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

MyErrorHandler

下面是ErrorHandler接口的樣本實現。如果不重新拋出異常,驗證將繼續。

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

} 

更多信息

+2

嗨@blaise我用這種方法唯一的問題是,我得到的是一個字符串,其中包含所有詳細信息,如「cvc-pattern-valid:值'12345678901'對於類型'id'的模式'\ d {10}'不是facet-valid。]「...因爲我需要知道什麼特定元素是錯誤的,我沒有其他選擇,只是解析字符串 – Rodrigo

相關問題