我正在尝试向工作中调用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生成了客户端,minOccurs
和maxOccurs
就会被忽略...]
当缺少必需元素时如何使JAXB失败?
我们注意到,即使对于具有minOccurs="1"
的元素,相应生成的属性的注释也不包含required = true
。我尝试在生成之后和启动应用程序之前手动添加它,但是没有成功:似乎只是被忽略了...
答案 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