缺少必需元素时,如何使JAXB失败?

时间:2019-06-14 14:43:46

标签: xsd jaxb cxf wsdl2java fail-fast

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

应用程序使用wsdl2java Maven插件从WSDL生成CXF Web服务客户端。然后,它将使用生成的客户端(通过JMS上的SOAP)与Web服务进行通信。 当Web Service在其对呼叫的响应中发送未知元素时,JAXB失败,并出现“意外元素”错误,这是可以理解的,并且符合XML。为了更向前兼容,我指定了一个自定义jaxb-reader-validation-event-handler来忽略这些特定的错误,从而解决了问题。

但是在进行一些补充测试时,我发现了不符合XML的行为。
首先,即使在sequence中,JAXB也不关心元素的顺序,这不符合XML,但是对于前向兼容性很好,所以为什么不这样做。
但是,它也不在乎是否不存在必需元素(minOccurs="1"),请为它分配一个任意默认值(对于绑定到Java基本值的元素,它们的默认值,例如0表示int!)。
这既不符合XML,又对兼容性不佳:如果您需要强制性的价格(例如整数),但是Web Service由于某种原因不提供价格,则JAXB会分配值0而不发出警告,使调试工作非常困难。
显然,这是因为如果JAXB没有遇到一个元素,它就不会调用它的setter,这意味着它将保留其默认值。
[编辑:我进行了一些补充测试,当应用程序期望1个元素(maxOccurs="1")但Web服务发送2时,JAXB两次调用相同的setter,将第一个值替换为第二个值,因此似乎一旦从WSDL生成了客户端,minOccursmaxOccurs就会被忽略...]

当缺少必需元素时如何使JAXB失败?


我们注意到,即使对于具有minOccurs="1"的元素,相应生成的属性的注释也不包含required = true。我尝试在生成之后和启动应用程序之前手动添加它,但是没有成功:似乎只是被忽略了...

1 个答案:

答案 0 :(得分:0)

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