这实际上是不正确的,因为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 的关闭。但这并不能回答您的问题,因为目前可能没有答案。
那里的评论大多建议要么忍住并一路检查空值,使用反射,要么只是捕获错误。出于性能考虑,我最终选择了第一个选项。
也许是你目前能做的最好的事情。这就是我所做的(检查null
s) 一直。嗯,不太好,但也很琐碎。
接下来,我想了一下如何解决这个问题?
XJC支持plugins https://jaxb.java.net/plugin.html这可以增强生成的代码。这是一个非常强大的工具,我用这些插件做了很多事情。但是应该生成什么代码呢?在 Java 中它应该是什么样子的?
用默认值填充属性是不正确的。我认为这样下去不会有好的结果。
就像是rootObject.getAccount().getAccountName()
不会工作,因为null
s。那么在 Java 中它会是什么样子呢?
我想到的最好的事情是像这样的界面getValueByPath(String propertyPath)
这样你就可以做类似的事情:
rootObject.getValueByPath(`account.accountName`);
The getValueByPath(String path)
可以由插件生成。可以生成解决此类问题的代码path
没有任何反射。生成的代码将检查自己的属性并返回目标值,或者调用getValueByPath(...)
就可以了或者返回null
如果没有找到/null
.
但是这样你就没有自动完成功能,整个事情就会更容易出错。