JAXB Unmarshal 创建一个空对象

Posted

技术标签:

【中文标题】JAXB Unmarshal 创建一个空对象【英文标题】:JAXB Unmarshall Created an Empty Object 【发布时间】:2011-02-07 15:55:15 【问题描述】:

我正在使用 JAXB 将 XML 文件解组为对象树。根对象是非空的,但它的所有成员都是空的,即使 XML 文件中有数据。我的对象类是使用来自 wsdls 的 Axis2 生成的。我有 ObjectFactory 类、jaxb.in​​dex 类、package.info 注释等。

我的问题和这个讨论一样:http://old.nabble.com/AXIS2,-JAXB---Unmarshalling-td26847419.html

首先:有没有办法让它正确填充数据?

如果没有,是否有一个很好的 Axis2 或 JAXB 替代库可以做同样的事情,但可以很好地相互配合?

【问题讨论】:

在回答这个问题之前,我们需要一些示例 JAXB 类和 XML。 你找出造成这个问题的原因了吗? 【参考方案1】:

默认情况下,JAXB 会默默地忽略错误。我看不出这是默认配置的任何原因。如果出现问题,请尝试添加此代码以引发异常。

unmarshaller.setEventHandler(
    new ValidationEventHandler() 
        @Override
        public boolean handleEvent(ValidationEvent event ) 
            throw new RuntimeException(event.getMessage(),
                                       event.getLinkedException());
        
);

【讨论】:

很好的建议。然而,我会警告不要认为 JAXB 开发人员不是很好 - JAXB 的大部分内容都是由 Jenkins 背后的天才 Kohsuke Kawaguchi 编写的。允许一个可插入的事件处理程序允许极大的灵活性(以简单为代价)。 @JaysonRaymond - 你说得对,我不应该使用这些词。然而,我刚刚发现我浪费了两天的工作,因为 JAXB 默默地忽略了错误,这至少可以说是令人沮丧的。我强烈认为这不应该是默认配置,但我会编辑我的回答中的措辞。 如果你使用Jaxb2Marshaller,那就是unmarshaller.setValidationEventHandler() 我浪费了很多时间试图找出我的 pojo 有什么问题。这终于是最大的帮助:) 另一种选择是使用 DefaultValidationHandler:unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler());【参考方案2】:

最近我遇到了类似的问题,可以解决如下:

1) 修复 xsd 文件。 在我的例子中,我确保 xsd 中的所有复杂元素都使用 ref 属性引用它们对应的类型,而不是使用 type 属性声明它们。

我已经通过在 Eclipse 中通过 XML Schema 文件选项创建一个 xml 文件来验证我的 xsd 是否正确。

在修复之前,xml 文件中的根元素为空。修复 xsd 后,使用一些示例值正确创建了 xml。

2) 清理并重新构建 在重新生成类之前必须进行清理。

【讨论】:

【参考方案3】:

只是想补充一点,当Axis2与Rampart(SOAP Body加密)和JAXB一起使用时,总是会出现这个问题。

详情请见:AXIS2-4981

【讨论】:

【参考方案4】:

必须编译 package-info.java 文件。 Eclipse 必须找到所有 .java 文件并编译它们。如果从命令行编译,并让 javac 搜索依赖项,它不会找到它。然后,当您运行时,您会得到空对象。似乎 JAXB 中的一个错误至少不能在某处导入该文件。并且错误应该告诉您可以编译该文件。

【讨论】:

【参考方案5】:

当用于创建 Java 代码的 xsd 文件引用了无法访问的 url 时,我遇到了这个问题。

幸运的是,所有这些引用都出现在 package-info.java 文件中,所以我最终不得不在删除它们的 xjc 任务之后添加一个 antRun 任务。

【讨论】:

以上是关于JAXB Unmarshal 创建一个空对象的主要内容,如果未能解决你的问题,请参考以下文章

Jaxb UnMarshal 错误:意外元素(uri:“”,本地:“processedSalesOrderTypeList”)。预期的元素是

Unmarshal NullPointerException(带有 JAXB 参考实现)

XML解析器(Unmarshal)使用JaxB从xml文件中获取元素

使用 JAXB 和 Unmarshal 过早结束文件。响应中的 xml 对我来说似乎有效

将Java从1.8.0_45更新为1.8.0_131后,JAXB unmarshal字段为空

Golang json Unmarshal “JSON 输入意外结束”