使用wsimport处理波兰财政部多消息体WSDL生成客户端代码遇问题
解决wsimport解析多Part WSDL消息的异常问题
我之前在对接类似的政府部门SOAP API时也碰到过wsimport解析多Part消息失败的问题,针对你这个波兰财政部VAT核验API的情况,给你几个可行的解决方案:
1. 自定义JAX-WS绑定文件修正解析规则
wsimport默认的包装器风格可能不兼容这种多Part的消息定义,你可以创建一个JAX-WS绑定文件来指定处理逻辑:
首先创建bindings.xml文件(放在项目src/main/resources目录下):
<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" wsdlLocation="https://sprawdz-status-vat.mf.gov.pl/?wsdl" version="2.0"> <!-- 针对目标消息禁用包装器风格 --> <jaxws:bindings node="wsdl:definitions/wsdl:message[@name='SprawdzNIPNaDzienZapytanie']"> <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle> <!-- 为Data类型指定Java日期转换规则 --> <jaxb:globalBindings> <jaxb:javaType name="java.util.Date" xmlType="tns:Data" parseMethod="javax.xml.bind.DatatypeConverter.parseDate" printMethod="javax.xml.bind.DatatypeConverter.printDate"/> </jaxb:globalBindings> </jaxws:bindings> </jaxws:bindings>
然后在Maven的wsimport插件中配置这个绑定文件:
<plugin> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>2.3.5</version> <executions> <execution> <goals> <goal>wsimport</goal> </goals> <configuration> <wsdlUrls> <wsdlUrl>https://sprawdz-status-vat.mf.gov.pl/?wsdl</wsdlUrl> </wsdlUrls> <bindingFiles> <bindingFile>src/main/resources/bindings.xml</bindingFile> </bindingFiles> <packageName>com.yourpackage.vatcheck</packageName> </configuration> </execution> </executions> </plugin>
2. 改用Apache CXF的wsdl2java插件
Apache CXF的代码生成工具对复杂WSDL的兼容性更好,你可以替换Maven插件为cxf-codegen-plugin:
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>3.6.2</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <goals> <goal>wsdl2java</goal> </goals> <configuration> <wsdlOptions> <wsdlOption> <wsdl>https://sprawdz-status-vat.mf.gov.pl/?wsdl</wsdl> <extraargs> <extraarg>-p</extraarg> <extraarg>com.yourpackage.vatcheck</extraarg> </extraargs> </wsdlOption> </wsdlOptions> </configuration> </execution> </executions> </plugin>
3. 本地修正WSDL后再解析
如果以上方法都不行,可以先把WSDL下载到本地,检查tns:NIP和tns:Data的类型定义是否存在命名空间引用不规范、类型冲突等问题,手动修正后再用wsimport处理。
内容的提问来源于stack exchange,提问作者Dcortez
相关产品推荐
相关产品推荐

