0

我正在尝试为在工作中调用 Web 服务的 Java 应用程序添加一些前向兼容性,但 JAXB 似乎在该主题上表现落后......

该应用程序使用wsdl2javaMaven 插件从 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。我尝试在生成之后和启动应用程序之前手动添加它,但没有成功:似乎它只是被忽略了......

4

1 回答 1

1

也许额外的 JSR-303 验证涵盖了您想要实现的目标。您可以使用以下插件扩展 xjc 的行为:https ://github.com/krasa/krasa-jaxb-tools以注释绑定类,或使用 Hibernate Validator 与 XML 验证配置结合使用,如下所述:https:// /docs.jboss.org/hibernate/validator/4.1/reference/en-US/html/validator-xmlconfiguration.html#validator-xmlconfiguration

于 2019-06-23T20:46:26.973 回答