当前位置: 首页 > 知识库问答 >
问题:

如何从JAXB验证器获取错误详细信息?

谢和同
2023-03-14

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

到目前为止,我还不走运,我知道这个类ValidationEventHandler,但显然我可以将它用于解组器类,问题是我必须验证对象,而不是原始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'对于类型'id'的模式'\d{10}'无效。]

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

共有2个答案

郏经纬
2023-03-14

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

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

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

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

cvc maxInclusive valid:对于类型“#AnonType_LongitudeGraphicalPosition.”的maxInclusive“180.0”,值“360.953674”无效
cvc型。3.1.3:元素“经度”的值“360.953674”无效

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

结合I和II和一些内省,你可以重建一个完整的JavaBeans风格的路径到错误的字段。

龚安民
2023-03-14

您可以在验证器上设置ErrorHandler的实例来捕获单个错误:

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

迈罗汉德勒

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

} 

获取更多信息

  • http://blog.bdoughan.com/2010/11/validate-jaxb-object-model-with-xml.html
 类似资料:
  • 问题内容: 我如何验证信用卡。我需要做检查。黑莓中有API可以做到吗? 问题答案: 您可以使用以下方法来验证信用卡号

  • 我在我的nodejs应用程序中为注册用户在keybeat上实现了keybeat,我使用的登录API是: 如果用户名和密码正确,则返回登录用户的令牌, 现在我需要传递这个令牌(通过上面的API返回),并检查这个令牌是否正确,如果令牌正确,我需要用户详细信息,是否有用于此的API。 提前谢谢

  • 我有一个简单的登录模型类,几乎没有数据注释验证 View是一个部分View,如下所示: 我相信我已经做了验证消息显示所需的所有事情,但它没有,客户端验证也没有。在母版页的头部区域,我还包括了以下脚本 是什么导致了这个问题?解决办法是什么?

  • 问题内容: 在WooCommerce中,从以下代码行: 如何从订单ID获取WooCommerce订单详细信息? 问题答案: 3.0版以上的WOOCOMMERCE订单 自Woocommerce大型主要更新3.0+以来,事情已经发生了很多变化: 对于 对象,无法像以前一样直接访问属性,并且会引发一些错误。 现在,对象实例需要使用new 以及 getter和setter方法。 此外,还有一些用于订购商品

  • 问题内容: 我要获取exe / dll / sys文件的“文件描述”和“版权”,如右键单击文件并选择属性时,在“详细信息”选项卡中所示。 问题答案: 使用Windows API,您可以调用VerQueryValue以获取该信息。JNA有一个用于访问此API的类,称为Version。 这另一个问题有一些代码示例可以帮助您入门: 获取.exe的版本信息 这是一个读取产品名称的C代码示例,您可以将其转换

  • 我有一个MVC6站点,它已部署为Azure Web应用程序。我已使用服务器资源管理器在Visual Studio中启用了所有跟踪/诊断选项。我正在尝试进行远程调试,但我在浏览器上只看到一个错误500,没有找到任何关于错误发生的确切位置的信息(或触发错误断点)。 在从Azure获取的文件日志中找不到任何错误跟踪。 我应该如何解决Azure Web应用程序中的错误500? 将“CustomErrors