2010-11-22 4 views
7

В настоящее время я работаю над клиентом веб-службы, использующим CXF без файлов конфигурации Spring.CXF Как установить SoapVersion на порт CXF без пружины

Он работает очень хорошо, но я не могу понять, как установить привязку SoapVersion с помощью Java Api. Использование Spring файла это делается следующим образом:

<jaxws:binding> 
    <soap:soapBinding version="1.2"/> 
</jaxws:binding> 

ли вы, ребята, знаете, как это сделать в коде Java (на порт, на SOAPBinding ...)?

Заранее благодарим за вашу помощь!

EDIT ----------------------

Я все еще застрял с этой проблемой ... я пытался добавить SOAPBinding аннотацию на интерфейсе, как было предложено в одном из ответов ниже, но это не сработало ... Я все еще ищу способ вручную настроить свой порттип/привязку/шину для использования Soap 1.2 ...

Любой идеи?

EDIT ----------------------

Проблема решена! На самом деле я ответил на свой вопрос: см. Ниже ...

Спасибо!

ответ

13

Хорошо, я снова отвечаю на свой вопрос, чтобы поделиться решением. С помощью ребята из списка рассылки CXF я нашел решение, которое работает для меня. Существует фактически 2 способа решения проблемы. Вот объяснение:

Проблема возникла из-за того, как я строил свою службу CXF.

Первое решение, чтобы указать местоположение WSDL во время создания службы:

// Create the service 
Service service = Service.create(urlToWsdl, serviceQName); 
// Access the port 
return service.getPort(serviceQName, portTypeClass); 

Это решило проблему, но я не хочу иметь ссылку на WSDL, так вот второе решение, избавляется от этой ссылки:

// Create the service 
Service service = Service.create(serviceQName); 
// Add a Port to the service and specify the SOAP 1.2 binding 
service.addPort(serviceQName, javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING, wsUrl); 
// Access the port 
return service.getPort(serviceQName, portTypeClass); 

В моем проекте мы решили выбрать второе решение.

Надеюсь, это поможет!

6

Самый простой, вероятно, просто придерживаться аннотацию на интерфейсе:

@BindingType(SOAPBinding.SOAP12HTTP_BINDING) 
+0

Спасибо за ваш ответ, но у меня нет доступа к интерфейсу ... – reef 2010-11-23 08:34:46

+0

@reef: С чего вы получаете описание интерфейса? – 2010-11-23 13:33:09

+0

@Donal Fellows Это результат выполнения инструмента wsdl2java. Это в основном одна из моих зависимостей проекта. – reef 2010-11-23 13:47:54

0

Как было предложено Донал Fellows я отвечаю на свой вопрос;)

На самом деле проблема была связана с версией Soap сервер может обрабатывать. На стороне клиента мне не нужно указывать, что я хочу использовать Soap 1.2, кажется, достаточно, чтобы PortType в файле WSDL был настроен на Soap 1.2. Но на стороне сервера мне нужно явно указать, какую версию мыла я хочу. На стороне сервера я все еще использовать «Весна-режим» для конфигурации CXF, таким образом, я просто добавил следующее в конфигурационном файле XML:

<jaxws:binding> 
    <soap:soapBinding version="1.2"/> 
</jaxws:binding> 

Это все люди! Спасибо за ваше время и помощь!

EDIT --------------------------------

На самом деле это решение не работает теперь, когда мы свяжитесь с сервером, которого мы не справляемся .... Мы по-прежнему придерживаемся нашей проблемы здесь.

0

Старая нить. Я думал, что отправлю решение, которое сработало для меня. В файле cxf-beans.xml я изменил endpointName="tns:MR_ServerSoap12" с endpointName="tns:MR_ServerSoap". Обратите внимание, что имя конечной точки будет иметь свое имя в вашем wsdl. Используйте это имя.

1

Если вы используете клиент cxf, вы можете использовать следующий способ. Также он может связывать более одного wsdl.

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
factory.setServiceClass(WebServiceClass); 
     BindingConfiguration config = new BindingConfiguration() { 

    @Override 
    public String getBindingId() { 
      // TODO Auto-generated method stub 
      return "http://www.w3.org/2003/05/soap/bindings/HTTP/";//SOAPVersion.SOAP_12.httpBindingId 
    } 
    }; 
    factory.setBindingConfig(config); 
Смежные вопросы