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

Rod*_*igo 6 java xml schema xsd jaxb

我有一些带有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);
Run Code Online (Sandbox Code Playgroud)

这段代码可以工作,它将验证对象并在消息中引发异常,如下所示:

cvc-pattern-valid:对于类型为'id'的模式'\ d {10}',值'12345678901'不是facet-valid.

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

bdo*_*han 1

您可以设置一个实例ErrorHandlerValidator捕获单个错误:

    Validator validator = schema.newValidator();
    validator.setErrorHandler(new MyErrorHandler());
    validator.validate(source);
Run Code Online (Sandbox Code Playgroud)

我的错误处理程序

下面是该接口的示例实现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();
    }

} 
Run Code Online (Sandbox Code Playgroud)

了解更多信息

  • 嗨@blaise,我使用这种方法遇到的唯一问题是,我得到的只是一个包含所有详细信息的字符串,例如“cvc-pattern-valid:值'12345678901'对于模式'\d{10来说不是facet-valid” }' for type 'id'.]"... 因为我需要知道哪个特定元素是错误的,所以我没有其他选择,只能解析字符串 (3认同)