如何从JAXB Validator获取错误详细信息?

时间:2012-06-18 04:31:20

标签: java xml jaxb xsd schema

我有一些带有JAXB注释的类,我创建了一些实例,我需要根据我的XSD文件验证它们。当对象无效时,我应该能够得到错误的细节。

到目前为止,我还没有运气,我知道这个类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-pattern-valid:值'12345678901'不是方面有效的   模式'\ d {10}'用于'id'类型。]

问题是我需要特定的细节,使用类似于我必须解析所有消息的字符串。

2 个答案:

答案 0 :(得分:0)

您可以在ErrorHandler上设置Validator的实例以捕获个别错误:

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

} 

了解更多信息

答案 1 :(得分:0)

I。如果验证复杂的对象层次结构,则可以自己创建Marshaller并设置其侦听器:

Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setListener(yourListener);
JAXBSource source = new JAXBSource(marshaller, object);

该侦听器在遍历层次结构时将收到有关对象实例的通知。

II。从另一个答案中添加一个ErrorHandler。至少在Wildfly 15中,消息如下所示:

cvc-maxInclusive-valid:值“ 360.953674”对于类型“ #AnonType_longitudeGeographicalPosition”的maxInclusive“ 180.0”而言不是有效的。”
cvc-type.3.1.3:元素“经度”的值“ 360.953674”无效。”

因此,您可以解析出元素名称,即有罪的终端字段名称。

III。结合使用I和II进行一些自省,然后可以根据需要重建指向错误字段的完整Java Beans样式路径。