我正在尝试为在工作中调用 Web 服务的 Java 应用程序添加一些前向兼容性,但 JAXB 似乎在该主题上表现落后......
该应用程序使用wsdl2java
Maven 插件从 WSDL 生成 CXF Web 服务客户端。然后,它使用生成的客户端与 Web 服务进行通信(通过 JMS 上的 SOAP)。当 Web 服务在其对调用的响应中发送未知元素时,JAXB 会失败并出现“意外元素”错误,这是可以理解且符合 XML 的。为了更加向前兼容,我指定了一个自定义jaxb-reader-validation-event-handler
来忽略这些特定错误,从而解决了问题。
但是在进行一些补充测试时,我发现了不符合 XML 的行为。
首先,JAXB 不关心元素的顺序,即使在 a 内部也是sequence
如此,这不是 XML 兼容的,但有利于向前兼容,所以为什么不呢。
但是,它也不关心强制元素 ( minOccurs="1"
) 是否不存在,而是友好地为其分配一个任意默认值(即,对于绑定到 Java 原始值的元素,它们的默认值,如 0 代表一个int
!)。
这既不符合 XML ,也不利于兼容性:如果您需要一个强制性的,例如,作为整数的价格,但 Web 服务由于某种原因没有提供它,JAXB 将值 0 分配给它而不发出警告,使调试非常困难。
显然这是因为如果 JAXB 没有遇到元素,它根本不会调用它的 setter,这意味着它将保持其默认值。
[编辑:我做了一些补充测试,当应用程序需要 1 个元素maxOccurs="1"
(来自 WSDL,minOccurs
并且maxOccurs
被简单地忽略...]
当缺少必需元素时,如何使 JAXB 失败?
我们注意到,即使对于带有 的元素minOccurs="1"
,相应生成属性的注释也不包含required = true
。我尝试在生成之后和启动应用程序之前手动添加它,但没有成功:似乎它只是被忽略了......