如何使用JAXB将缺少的元素解组为空对象

时间:2014-11-10 23:54:57

标签: java xml maven intellij-idea jaxb

我在Intellij-IDEA中使用JAXB Maven插件(org.codehaus.mojo:jaxb2-maven-plugin:1.6)来为对象生成给定的xsd文件。 xsd非常大,包含许多类型,其中大多数是可选的。

现在,当我将XML解组为对象时,缺少的元素表示为空对象。

例如,如果我尝试执行rootObject.getAccount().getAccountName()但是从XML中完全缺少Account元素,我会得到NullPointerException

我想配置JAXB来解组整个对象树,以包含那些代表缺少元素的对象。

这可能吗?

1 个答案:

答案 0 :(得分:2)

这实际上是不正确的,因为null属性在语义上与这个以某个默认值存根的属性不同。因此,为缺失值设置一些new Account()account属性是不正确的。

如果您想简化代码,请考虑使用JAXB2 Fluent API plugin。您可能会获得如下代码:

rootObject.withAccount().getAccountName()

(隐式初始化account。)我不是百分之百确定它是否会以这种方式运作,但绝对值得一试。

<强>更新

关于你的评论的一些注释。

  

我查看了您发布的链接并尝试在线查找,但如果我理解正确,它主要用于填充对象中的值而不是阅读它们。您发送的链接说:FluentApi插件为bean setter提供Method Chaining。我正在寻找一种方法以某种方式避免在尝试访问嵌套类时检查空值。

你是对的。但是你特意说&#34;解组整个对象树以包含代表缺失元素的那些&#34; 。我的观点是,JAXB填写这些缺失的属性是不正确的,但可以做到这一点,而Fluent API插件是我对一个易于使用的API的关闭案件。但这并没有回答你的问题,因为目前可能没有答案。

  

那里的评论大多建议要么吸收它并检查沿途的空值,使用反射,或者只是捕获错误。我最后选择了第一个性能考虑因素。

目前你可以做的最好的事情。这就是我一直在做的事情(检查null)。嗯,不太好,但也很琐碎。

接下来,我想知道如何解决这个问题呢?

XJC支持plugins,可以增加生成的代码。这是一个非常强大的工具,我用这些插件做了很多。但是应该生成什么代码?在Java中应该怎么样?

使用默认值填充属性根本不正确。我认为这样做不会带来好结果。

rootObject.getAccount().getAccountName()之类的内容由于null而无法正常工作。那么在Java中它会是什么样子?

我想到的最好的事情是像getValueByPath(String propertyPath)这样的界面,所以你可以这样做:

rootObject.getValueByPath(`account.accountName`);

getValueByPath(String path)可以由插件生成。可以生成将在没有任何反射的情况下解析此类path的代码。生成的代码将检查自己的属性并返回目标值,或在其上调用getValueByPath(...)或如果未找到/ null则返回null

但是后来你没有自动完成,整个事情会更容易出错。