如何使用 JAXB 将丢失的元素解组到空对象中

2024-02-12

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

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

例如,如果我想做rootObject.getAccount().getAccountName()但是 XML 中完全缺少 Account 元素,我得到一个NullPointerException

我想配置 JAXB 来解组完整的对象树以包含那些表示缺失元素的对象。

这可能吗?


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

如果您想简化代码,请考虑使用JAXB2 Fluent API 插件 https://java.net/projects/jaxb2-commons/pages/Fluent-api。您可能会得到如下代码:

rootObject.withAccount().getAccountName()

(隐式初始化account.) 我不是 100% 确定它是否会这样工作,但绝对值得一试。

Update

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

我查看了您发布的链接并尝试在网上查找它,但如果我理解正确的话,它主要用于填充对象中的值而不是读取它们。您发送的链接显示:FluentApi 插件为 bean setters 提供了方法链。我正在寻找一种方法来在尝试访问嵌套类时避免检查空值。

你是对的。不过你具体说“解组完整的对象树以包含那些代表缺失元素的对象”。我的观点是,JAXB 填写这些缺失的属性是不正确的,但是you可以做到这一点,Fluent API 插件是我所知道的针对这种情况的易于使用的 API 的关闭。但这并不能回答您的问题,因为目前可能没有答案。

那里的评论大多建议要么忍住并一路检查空值,使用反射,要么只是捕获错误。出于性能考虑,我最终选择了第一个选项。

也许是你目前能做的最好的事情。这就是我所做的(检查nulls) 一直。嗯,不太好,但也很琐碎。

接下来,我想了一下如何解决这个问题?

XJC支持plugins https://jaxb.java.net/plugin.html这可以增强生成的代码。这是一个非常强大的工具,我用这些插件做了很多事情。但是应该生成什么代码呢?在 Java 中它应该是什么样子的?

用默认值填充属性是不正确的。我认为这样下去不会有好的结果。

就像是rootObject.getAccount().getAccountName()不会工作,因为nulls。那么在 Java 中它会是什么样子呢?

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

rootObject.getValueByPath(`account.accountName`);

The getValueByPath(String path)可以由插件生成。可以生成解决此类问题的代码path没有任何反射。生成的代码将检查自己的属性并返回目标值,或者调用getValueByPath(...)就可以了或者返回null如果没有找到/null.

但是这样你就没有自动完成功能,整个事情就会更容易出错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 JAXB 将丢失的元素解组到空对象中 的相关文章

随机推荐