【问题标题】:How to get error details from JAXB Validator?如何从 JAXB Validator 获取错误详细信息?
【发布时间】:2012-06-20 01:46:57
【问题描述】:

我有一些带有 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' 不是 facet-valid 为类型 'id' 模式化 '\d{10}'。]

问题是我需要特定的详细信息,使用这样的字符串我必须解析所有消息。

【问题讨论】:

标签: java xml jaxb xsd schema


【解决方案1】:

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

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

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

二。从另一个答案中添加ErrorHandler。至少在 Wildfly 15 中,消息看起来像:

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

这样就可以解析出元素名,也就是有罪的终端字段名。

三。将 I 和 II 与一些内省结合起来,如果需要,您可以重建一个完整的 Java Beans 样式路径到错误字段。

【讨论】:

    【解决方案2】:

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

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

    更多信息

    【讨论】:

    • 嗨@blaise 我对这种方法的唯一问题是我得到的只是一个包含所有细节的字符串,例如“cvc-pattern-valid: Value '12345678901' is not facet-valid with关于类型 'id' 的模式 '\d{10}'。]"... 因为我需要知道哪个特定元素是错误的,所以我别无选择,只能解析字符串
    猜你喜欢
    • 1970-01-01
    • 2012-12-26
    • 2011-01-31
    • 1970-01-01
    • 2021-12-23
    • 2018-07-25
    • 1970-01-01
    • 2022-08-19
    • 2011-03-07
    相关资源
    最近更新 更多