2016-09-06 2 views
1

Прежде всего, я знаю, что на эту тему уже есть некоторые вопросы, но ни одна из них не решила мою проблему (или я тоже глупо понимать их, это тоже возможно).Apache CXF: сообщение SOAP 1.2 недействительно при отправке только в конечную точку SOAP 1.1

Итак, у меня есть WSDL. Из WSDL я создал Java-клиент, используя плагин Eclipse CXF. Теперь я делаю это:

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
factory.setServiceClass(MyServiceInterface.class); 
factory.setAddress("myEndpoint"); 
List<Interceptor<? extends Message>> interceptors = new ArrayList<Interceptor<? extends Message>>(); 
interceptors.add(new HeaderOutInterceptor()); 
factory.setOutInterceptors(interceptors); 

MyServiceInterface service = (MyServiceInterface) factory.create(); 

Перехватчик только добавляет заголовок запросов я посылаю через клиент:

message.put(Message.CONTENT_TYPE, "application/soap+xml"); 

Я добавляю это вручную, так как по умолчанию типа контента это text/xml, и я получаю ошибку 415.

Проблема заключается в том, что при такой конфигурации я получаю это исключение:

org.apache.cxf.binding.soap.SoapFault: A SOAP 1.2 message is not valid when sent to a SOAP 1.1 only endpoint. 
at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:178) 
at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:69) 
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) 

Я пытался добавить эту аннотацию к сгенерированного клиентского интерфейса:

@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING) 

Но ничего не изменилось. Кто-нибудь может мне помочь?

EDIT

Я добавил файл cxf.xml под классами. Это содержание:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" 
xmlns:soap="http://cxf.apache.org/bindings/soap" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
     http://cxf.apache.org/bindings/soap 
     http://cxf.apache.org/schemas/configuration/soap.xsd 
     http://cxf.apache.org/jaxws 
     http://cxf.apache.org/schemas/jaxws.xsd"> 

<jaxws:endpoint serviceName="ClabService" endpointName="ClabServicePort"> 
    <jaxws:binding> 
     <soap:soapBinding version="1.2" mtomEnabled="true" /> 
    </jaxws:binding> 
</jaxws:endpoint> 

</beans> 

Однако, теперь я получаю это исключение:

Exception in thread "main" java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.cxf.jaxws.EndpointImpl---51955260': Invocation of init method failed; nested exception is javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException: serviceClass must be set to a valid service interface or class 

Я пытался добавить это во время заводской конфигурации:

factory.setServiceClass(MyServiceInterface_Service.class); 

, но ничего не изменилось.

+0

нужны дополнительные разъяснения по этому вопросу. Какова конечная точка, которую вы пытаетесь ударить? –

+0

Конечная точка работает нормально, если я использую интерфейс SOAP, я получаю правильный ответ. Я думаю, проблема заключается в том, что CXF генерирует клиент SOAP 1.1, а ответ сервера - 1,2. – Aurasphere

+1

, если вы получаете пространство имен как «SOAP_NAMESPACE =» http://www.w3.org/2003/05/soap-envelope ». Вы на мыле 1.2. вы можете это проверить? Исключение говорит иначе. –

ответ

9

Вы можете использовать JaxWsClientFactoryBean для создания клиента. У него будет опция setBinding to Soap 1.2.

JaxWsClientFactoryBean factory = new JaxWsClientFactoryBean(); 
factory.setServiceClass(MyServiceInterface.class); 
factory.setAddress("myEndpoint"); 
List<Interceptor<? extends Message>> interceptors = new ArrayList<Interceptor<? extends Message>>(); 
interceptors.add(new HeaderOutInterceptor()); 
factory.setOutInterceptors(interceptors); 
factory.setBindingId("http://www.w3.org/2003/05/soap/bindings/HTTP/");//soap 1.2 
MyServiceInterface service = (MyServiceInterface) factory.create(); 
+1

Добавление этой строки работало для меня: 'factory.setBindingId (" http://www.w3.org/2003/05/soap/bindings/HTTP/ ");' –

+3

Доступные привязки можно найти в 'javax.xml Интерфейс .ws.soap.SOAPBinding' – geg

0

geg уже сказал, я просто хочу, чтобы сделать его более заметным:

import javax.xml.ws.soap.SOAPBinding; 
... 
factory.setBindingId(SOAPBinding.SOAP12HTTP_BINDING); 
Смежные вопросы