Сгенерированный CXF-CODEGEN клиент нуждается в пространстве имен на мыльном конверте - PullRequest
4 голосов
/ 02 марта 2012

Клиент, сгенерированный 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>

Единственное отличие, которое я вижу, это объявление пространства имен по умолчанию вместо объявления пространства имен на мыльном конверте и использование префикса пространства имен. Я пробовал несколько разных способов заставить сгенерированный клиент CXF создать такой же запрос мыла. Кто-нибудь может дать несколько указателей или мне нужно использовать что-то еще?

Я использую org.apache.cxf: cxf-codegen-plugin: 2.5.2 в JDK 6.

1 Ответ

2 голосов
/ 17 апреля 2012

Использовали ли вы JAXB для привязки данных? Я смог решить ту же проблему, используя вместо этого XMLBEANS. Смотрите флаг db для wsdl2java: http://cxf.apache.org/docs/wsdl-to-java.html

Я все еще ищу лучшее решение, чем просто изменение привязки данных.

Обновление 20012-04-18: Сергей и Аки из списка рассылки пользователей cxf были так любезны, чтобы показать мне TransformationFeature из CXF. Использование следующего кода на стороне клиента работает для меня:

        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. с 2.5.3 и 2.5.6 согласно Aki вы должны использовать свойство defaultNamespace.

...