使用CXF生成Web服务客户端时报‘Unbound PortType elements in Operation’错误
报错根因
你触发的WSI-BP-1.0 R2209 violation: Unbound PortType elements in Operation 'publishNewDescription'错误,是CXF内置的WS-I Basic Profile 1.0合规校验触发的规则拦截:
- WS-I BP R2209规则明确要求:采用document风格的SOAP绑定,每个操作对应的input、output消息中承载业务参数的part,必须在
wsdl:binding节点下通过<soap:body>元素做显式绑定声明 - 你当前的WSDL绑定定义里,仅给每个操作的input块加了WS-Security的SOAP Header绑定,完全遗漏了业务参数对应的
<soap:body>绑定配置,因此校验器会判定PortType中定义的操作存在未绑定的消息元素 - SoapUI可以正常调用的原因:SoapUI对WSDL的合规性校验阈值很低,遇到缺失的绑定声明时会自动按照通用规则补全隐含的绑定逻辑,不会像CXF那样严格执行JAX-WS规范校验阻断流程。
修复方法
方案1:修正WSDL的绑定定义
修改服务端返回的WSDL文件,在wsdl:binding节点下,给每个操作的input、output块补上缺失的<soap:body use="literal"/>声明,修改后的绑定结构参考:
<wsdl:binding name="PropertySetterImplServiceSoapBinding" type="tns:PropertySetter"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <!-- 以publishNewDescription操作为示例 --> <wsdl:operation name="publishNewDescription"> <wsdl:input> <!-- 保留原有WS-Security Header绑定配置 --> <soap:header message="tns:securityHeader" part="security" use="literal"/> <!-- 补上缺失的业务参数Body绑定 --> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <!-- 剩余publishNewImageURL、publishNewPrice两个操作,按照上述结构补全input、output的soap:body声明即可 --> </wsdl:binding>
方案2:生成代码时跳过合规校验
如果不想调整服务端返回的WSDL,可以在执行CXF WSDLToJava工具生成客户端代码时,加上跳过WS-I校验的参数,完整命令示例:
wsdl2java -d ./生成代码存放目录 -validate=none http://localhost:8080/eshopCXFService/services?wsdl
参数-validate=none会关闭CXF内置的WS-I Profile严格校验,直接基于WSDL结构生成客户端代码,不会因为缺失绑定声明抛出异常。
内容的提问来源于stack exchange,提问作者Jakub Matěna
相关产品推荐
相关产品推荐

