JAXB Unmarshal 创建一个空对象
Posted
技术标签:
【中文标题】JAXB Unmarshal 创建一个空对象【英文标题】:JAXB Unmarshall Created an Empty Object 【发布时间】:2011-02-07 15:55:15 【问题描述】:我正在使用 JAXB 将 XML 文件解组为对象树。根对象是非空的,但它的所有成员都是空的,即使 XML 文件中有数据。我的对象类是使用来自 wsdls 的 Axis2 生成的。我有 ObjectFactory 类、jaxb.index 类、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 对我来说似乎有效