【问题标题】:Jaxb fails to parse XML after moving to java 8迁移到 java 8 后,Jaxb 无法解析 XML
【发布时间】:2015-02-16 07:44:27
【问题描述】:

我正在迁移到 java 8,并且在此过程中 jaxb 无法解析 xml 配置。

虽然只更改了 JDK,但使用 java 7 成功解析了相同的代码和文件,但在 java 8 上无法正确解析。

请注意,没有抛出异常,但数据没有出现在 xml 解组到的对象中。

任何可能导致这个非常烦人的失败的想法。

【问题讨论】:

  • 您能否发布有关您的 XML 和对象模型的详细信息?
  • 没有你的对象模型我们只能猜测。如果你是从 java 6 迁移过来的,那么列表和地图的处理方式就会发生变化。
  • 我找到原因我会发布答案。

标签: java xml jaxb


【解决方案1】:

我已经找到问题的原因了。

我没有研究过代码,但似乎 JAXB 或 SAX 解析器背后的代码已经从 java7 更改为 8,并且在 java 8 中不太宽容。 (这也可能是由于编译器/jvm 本身的变化)

解析是通过注释完成的。它看起来像下面这样:

@XmlRootElement(name = "component_configuration")
@XmlAccessorType(XmlAccessType.NONE)
public class ComponentConfiguration extends Configuration {}

@XmlRootElement(name="configuration")
@XmlAccessorType(XmlAccessType.NONE)
public class Configuration {}

在 java 7 版本中,这种“游戏”要么被允许,要么被成功解析(如果你问我很幸运),但在 java 8 中它不再起作用了。

我再次正确地完成了模型的编写,一切正常。

希望这将有助于其他人在 jaxb 兼容性方面制动球。

【讨论】:

  • 您能否进一步解释您的答案,我认为您显示的映射没有任何问题。
  • 类之间存在继承关系,当我打破继承时,它们中的每一个都映射到不同的根元素。
  • 这应该不是问题。解组时是否获得了根类的正确子类型?是否只是未编组的属性(全部,仅继承,仅子类型上的属性)?您使用的是哪个版本的 Java 8 JDK?
  • 根“component_configuration”已被解析,其所有类型为“configuration”的子代均未解析,java 版本 1.8.0.25
  • 谢谢,我会将其转发给 JAXB 参考实现负责人。
【解决方案2】:

我发现在 Java 7 和 Java 8 上处理 Jaxb 之间的另一个区别。我已将问题简化为一个简化的示例。 (更改了类别,使其与工作无关等) 当 Unmarshaller 调用 List 的 setter 时:

  • 在 Java 7 中运行时,将使用 List 中的数据调用 setter
  • 在 Java 8 中运行时,setter 将仅使用空的 List 对象调用,该对象显然会在解组过程的后期填充。

我体验到的不同之处在于,我不能让 setter 对 List 进行任何处理,而是拥有一个仅在整个对象被解组后才被调用的进程。 或者总结一下,“不要在setter中做任何处理”。 我已在Difference in JAXB Java 7 versus Java 8

的问题中发布了修改后的示例

【讨论】:

  • 对此进一步提出问题 - 编码列表访问器的推荐做法是在编码 JaxB 时完全省略 Setter,因为 JaxB 似乎确实通过 Getter 处理列表? (可能还有其他推荐的替代方案)?
  • 我已经用一个更简化的代码示例重新发布了这个,作为一个单独的问题。我将删除此处的代码示例,因为我认为新 qeustion 中的版本将更容易引入典型的 IDE。 stackoverflow.com/questions/36361075/…
猜你喜欢
  • 1970-01-01
  • 2019-03-23
  • 2021-02-24
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 2013-04-30
相关资源
最近更新 更多