JAXB中将空字符串反序列化为null的正确方法

4

我需要处理大型XML文档,但有时会出现错误处理缺失属性数据的情况。与其忽略缺失的属性,它们通常被指定为空字符串值。这在取消编组时会导致问题,因为空字符串本身已经是一个值。

例如,原本应该是:

<SOME_ELEMENT attr1="someValue"/>

相反地

<SOME_ELEMENT attr1="someValue" attr2="" attr3=""/>

我正在试图优雅地处理这个格式不正确的XML的方法。目标是在属性值为空字符串时将属性视为省略,并且空字符串从未是该属性(例如Integers)的有效值。我目前使用XML适配器将这些空字符串翻译成null(如此帖子中建议的那样),但这似乎是错误的解决方案。我正在处理的文档中的许多属性已经使用了来自其他代码的类型适配器,而且似乎没有一种方法可以为属性指定多个XML适配器。
有没有我忽略了的标准方法来处理这种情况?
谢谢!
编辑
我正在寻找一种解决方案,不需要我编辑各种JAXB映射类,因为有几十个都有相同的需求。理想情况下,解决此问题的解决方案将允许我为所有属性指定通用策略,并在必要时允许特定的覆盖。

你想要<foo bar="">的行为是什么?你想让绑定的bar值为零、空或空字符串,还是完全不同的其他内容? - David W
另外,https://dev59.com/mlTTa4cB1Zd3GeqPu7jL 上有什么问题?这是一个语义问题,而不是XML语法问题。实际上,XML格式良好。我这么说是因为这意味着没有优雅的技术解决方案,因为这是一个业务逻辑问题。 - David W
对于 <foo bar=""/> 的行为应该是将相关的JAXB映射类中 "bar" 的值设置为 null,这将把它视为省略该属性。在我看来,业务逻辑是另一回事。我期望处理生成的JAXB对象树的代码负责业务逻辑(例如,如果省略了特定值,则拒绝XML文档)。我正在寻找的是一种通用方法,将所有空属性值视为已省略,因为空值从未有效。也许这种行为应该被视为业务逻辑? - Terence
另外,您发布的链接实际上是我在最初的帖子中提到并正在使用的链接。我的问题是这是否是我情况下的正确解决方案。基于您的回复(我很感激!),看起来这是“最正确”的解决方案,考虑到我处理问题的方式。但它似乎有点不太灵活,这也是我在第一篇帖子中提到的原因。 - Terence
好的……很抱歉让您再次引用链接。也许有一种方法可以首先使用 XSL 转换文档,但这也不是很理想。 - David W
2个回答

0

我认为你想要遵循的模式是在这篇文章中: 自定义JAXB取消编组过程的错误处理

使用元素,XML可以指定它为空(如下所示)。对于字符串类型,空元素和属性(有时还有缺少的元素)可以解释为空字符串。因此,您必须将逻辑视为业务逻辑,并使用afterUnmarshal事件进行处理。

<foo xsi:nil="true" />

不幸的是,该示例是基于元素而非属性的(我的问题涉及属性)。此外,帖子中建议使用的afterUnmarshal方法无法让我确定是否从空字符串解析了非字符串值或合法值(例如值为1的整数)。 - Terence
我的一个观点是只有 XML 元素可以为空,但这并不能帮助你。你能更具体地说明你的情况吗?这个元素是什么,属性是什么? - David W
我之前表述有点不清楚,抱歉。我已经更新了描述。 - Terence

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接