使用wsimport生成Java SOAP WebService客户端遇报错,如何强制生成?
解决wsimport生成SOAP客户端时的XSD解析错误问题
我之前也碰到过类似的WSDL解析兼容性问题——SOAP UI因为容错机制宽松能正常调用,但JAX-WS的wsimport工具对schema校验更严格,给你几个可行的解决方案:
方案一:用wsimport参数强制忽略解析警告
wsimport本身提供了宽松处理WSDL解析的参数,你可以试试以下命令:
wsimport -keep -verbose -ignore http://your-service-wsdl-url
-ignore参数会忽略所有非致命的解析错误和警告,强制生成客户端代码- 如果遇到命名空间冲突的问题,再加
-B-XautoNameResolution参数让工具自动处理:
wsimport -keep -verbose -ignore -B-XautoNameResolution http://your-service-wsdl-url
方案二:本地修改WSDL的XSD引用(不影响原COTS产品)
虽然你不能修改商用产品的原XSD,但可以下载WSDL和所有依赖XSD到本地,修改本地WSDL里的XSD引用路径,让wsimport能正确找到依赖的schema:
- 用浏览器或curl把WSDL文件下载到本地
- 找到WSDL里所有
<xsd:import>或<xsd:include>标签,将schemaLocation的值改成本地XSD文件的绝对/相对路径 - 用wsimport指向本地修改后的WSDL:
wsimport -keep -verbose ./local-modified.wsdl
这种方法能从根源解决schema找不到的问题,且只是修改本地副本,完全不会影响原产品运行。
方案三:换用Apache CXF的wsdl2java工具
如果wsimport还是不行,试试Apache CXF的wsdl2java——它对有瑕疵的WSDL兼容性更好,生成的代码也更完整(包含ObjectFactory类):
- 下载CXF二进制包,把
bin目录加入系统PATH - 执行生成命令:
wsdl2java -keep -verbose http://your-service-wsdl-url
需要指定生成包名的话,加上-p com.your.client.package参数即可。
关于Axis生成缺少ObjectFactory的问题
Axis生成代码缺ObjectFactory,通常是因为WSDL里的complexType定义特殊,Axis生成器没正确识别。换成JAX-WS标准的wsimport或CXF工具基本能解决,不建议手动补写ObjectFactory(容易出错)。
关于是否可以修改COTS的XSD?
你完全不需要修改原产品的XSD!只需在本地创建WSDL和XSD的副本,修改副本里的引用或少量内容适配代码生成工具即可——这不会对原服务造成任何影响,客户端代码只是用来调用服务,和原服务的schema定义完全兼容。
内容的提问来源于stack exchange,提问作者Jason Statham
相关产品推荐
相关产品推荐

