CXF生成的客户端发送以下SOAP请求,该请求不会从其端返回记录:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<PersonSearch xmlns="http://tlo.com/">
<genericSearchInput>
....
</genericSearchInput>
</PersonSearch>
</soap:Body>
</soap:Envelope>
SoapUI请求如下所示,并返回记录:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tlo="http://tlo.com/">
<soapenv:Header/>
<soapenv:Body>
<tlo:PersonSearch>
<!--Optional:-->
<tlo:genericSearchInput>
...
</tlo:genericSearchInput>
</tlo:PersonSearch>
</soapenv:Body>
</soapenv:Envelope>
我看到的唯一区别是默认的名称空间声明而不是soap信封上的名称空间声明和名称空间前缀的使用。我尝试了几种不同的方法来让CXF生成的客户端创建相同类型的soap请求。任何人都可以提供一些指示,还是我需要使用别的东西?
我在JDK 6上使用org.apache.cxf:cxf-codegen-plugin:2.5.2。
答案 0 :(得分:2)
您是否使用JAXB进行数据绑定?我能够通过使用XMLBEANS来解决同样的问题。请参阅wsdl2java的db标志:http://cxf.apache.org/docs/wsdl-to-java.html
我仍在寻找一种比仅更改数据绑定更好的解决方案。
更新20012-04-18:来自cxf用户邮件列表的Sergey和Aki非常友好地向我展示了CXF的TransformationFeature。在客户端使用以下代码对我有用:
MyService myService = new MyService();
myPort = myService.getMyServiceHttpSoap11Endpoint();
// See http://cxf.apache.org/docs/transformationfeature.html
Client client = ClientProxy.getClient(myPort);
Map<String, String> outTransformMap = Collections.singletonMap(
"{http://myNamespace}*",
"{http://myNamespace}*");
org.apache.cxf.interceptor.transform.TransformOutInterceptor transformOutInterceptor =
new org.apache.cxf.interceptor.transform.TransformOutInterceptor();
transformOutInterceptor.setOutTransformElements(outTransformMap);
client.getOutInterceptors().add(transformOutInterceptor);
我在CXF 2.5.2中使用它。根据Aki的2.5.3和2.5.6,您必须使用defaultNamespace属性。