CXF-CODEGEN在soap信封上生成客户端需要命名空间

时间:2012-03-02 17:11:44

标签: java soap jaxb cxf

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。

1 个答案:

答案 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属性。