JAXB自定义绑定报Prefix must resolve to a namespace: wsdl如何解决
问题修复方案
错误原因逐一梳理
1. 最初的Prefix must resolve to a namespace: wsdl错误
该错误是因为早期绑定文件未指定schemaLocation,JAXB解析XPath时无法将wsdl前缀绑定到对应命名空间的上下文,即使根节点声明了wsdl命名空间,也会因为没有关联具体WSDL文件的上下文而识别失败。
2. 后续的xpath evaluation of results in empty target node错误
更新命名空间后出现该问题,本质是XPath路径匹配问题,你后续调整绑定文件添加schemaLocation并修正路径后已经解决了该错误,进入下一个报错阶段。
3. 最终的two declarations cause a collision in the ObjectFactory class错误
该错误是因为你仅修改了复杂类型对应的Java类名,但JAXB生成的ObjectFactory类中,两个stringArray对应的工厂方法默认名称都是createStringArray,依然存在命名冲突。
最终可用的bind.xjb配置
你需要同时为两个绑定规则指定不同的工厂方法名即可解决冲突:
<jaxb:bindings version="1.0" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc"> <jaxb:bindings schemaLocation="https://demo-facturacion.finkok.com/servicios/soap/cancel.wsdl" node="/wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://facturacion.finkok.com/cancellation']/xs:complexType[@name='stringArray']"> <jaxb:class name="CancellationStringArray" /> <jaxb:factoryMethod name="createCancellationStringArray" /> </jaxb:bindings> <jaxb:bindings schemaLocation="https://demo-facturacion.finkok.com/servicios/soap/cancel.wsdl" node="/wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://facturacion.finkok.com/cancel']/xs:complexType[@name='stringArray']"> <jaxb:class name="CancelStringArray" /> <jaxb:factoryMethod name="createCancelStringArray" /> </jaxb:bindings> </jaxb:bindings>
可选优化配置
你可以在maven-jaxb2-plugin的configuration节点添加如下配置,优化生成逻辑:
<args> <!-- 开启自动命名冲突解决,作为自定义绑定的补充 --> <arg>-XautoNameResolution</arg> </args> <!-- 建议不要把生成代码写入src/main/java目录,默认的target目录会被maven自动识别为编译源码目录,避免手动管理生成代码的冗余 --> <generateDirectory>${project.build.directory}/generated-sources/xjc</generateDirectory>
内容的提问来源于stack exchange,提问作者Christian Del Rio
相关产品推荐
相关产品推荐

