2014-01-09 3 views
0

Я бы хотел добавить расходуемый контракт-первый веб-сервис в приложение Spring MVC - приложение является поставщиком веб-службы. В web.xml я добавил второй сервлет, который должен заботиться о запросах:Spring WS, похоже, игнорирует отображаемую конечную точку

<servlet> 
    <servlet-name>webservices</servlet-name> 
    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:/webservices-servlet.xml</param-value> 
    </init-param> 
    <init-param> 
     <param-name>transformWsdlLocations</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>webservices</servlet-name> 
    <url-pattern>/services/*</url-pattern> 
</servlet-mapping> 

webservices-servlet.xml содержит:

<context:component-scan base-package="de.y.application" /> 

<sws:static-wsdl id="yAdaptorService" location="/WEB-INF/wsdl/yAdapterService.wsdl" /> 

<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping"> 
    <property name="interceptors"> 
     <list> 
      <bean 
       class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor" /> 
      <bean 
       class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor"> 
       <property name="schema" value="/WEB-INF/wsdl/ResourceAdapter.xsd" /> 
       <property name="validateRequest" value="true" /> 
       <property name="validateResponse" value="true" /> 
      </bean> 
     </list> 
    </property> 
    <property name="order" value="1" /> 
</bean> 

При развертывании приложения и запущена в Tomcat 7, WSDL развернут на http://localhost:8080/application/services/yAdapterService.wsdl

Соответствующие фрагменты WSDL:

<message name="pingRequest"> 
</message> 
<message name="pingResponse"> 
</message> 
<portType name="yAdaptor"> 
    <operation name="ping"> 
     <input message="tns:pingRequest"></input> 
     <output message="tns:pingResponse"></output> 
    </operation> 
</portType> 
<binding name="SoapBinding" type="tns:yAdapter"> 
    <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <operation name="ping"> 
     <wsdlsoap:operation soapAction="urn:webservice.y.x.com:wsdl/ping"/> 
     <input> 
      <wsdlsoap:body use="literal"/> 
     </input> 
     <output> 
      <wsdlsoap:body use="literal"/> 
     </output> 
    </operation> 
</binding> 
<service name="yAdapterService"> 
    <port binding="tns:SoapBinding" name="yAdapterSoapPort"> 
     <wsdlsoap:address location="http://localhost:8080/application/services/yAdapterService"/> 
    </port> 
</service> 

Установка регистратора на уровне отладки, Tomcat говорит мне во время запуска:

09 Jan 2014 12:20:49,247 DEBUG org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping:105 - Mapped [{urn:webservice.x.com:wsdl}ping] onto endpoint [public void de.y.yAdapterService.ping()] 

Но когда дело доходит до простого пинг-запроса с помощью SOAP-интерфейса

SOAPAction: urn:webservice.x.com:wsdl/ping

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header/> 
    <soapenv:Body/> 
</soapenv:Envelope> 

к этому конечная точка

private static final String NAMESPACE_URI = "urn:webservice.x.com:wsdl"; 

@Override 
@PayloadRoot(localPart = "ping", namespace = NAMESPACE_URI) 
public void ping() 
{ 
    System.out.println("ping pong"); 
} 

м apped endpoint не найден

/* SOAP-UI REQUEST ON urn:webservice.x.com:wsdl/ping */ 
09 Jan 2014 12:21:44,808 DEBUG  org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter:136 - Opening JPA EntityManager in OpenEntityManagerInViewFilter 
09 Jan 2014 12:21:44,818 DEBUG org.springframework.security.util.FilterChainProxy:205 - Converted URL to lowercase, from: '/services/yadapterservice'; to: '/services/yadapterservice' 
09 Jan 2014 12:21:44,818 DEBUG org.springframework.security.util.FilterChainProxy:212 - Candidate is: '/services/yadapterservice'; pattern is /services/**; matched=true 
09 Jan 2014 12:21:44,818 DEBUG org.springframework.security.util.FilterChainProxy:165 - has an empty filter list 
09 Jan 2014 12:21:44,827 DEBUG org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter:114 - Accepting incoming [[email protected]95be] at [http://localhost:8080/application/services/yAdapterService] 
09 Jan 2014 12:21:44,864 DEBUG org.springframework.ws.server.MessageTracing.received:171 - Received request [SaajSoapMessage] 
09 Jan 2014 12:21:44,875 DEBUG org.springframework.ws.soap.server.SoapMessageDispatcher:278 - Endpoint mapping [org.springframework.ws.ser[email protected]b64f867] has no mapping for request 
09 Jan 2014 12:21:44,876 WARN org.springframework.ws.server.EndpointNotFound:241 - No endpoint mapping found for [SaajSoapMessage] 
09 Jan 2014 12:21:44,877 DEBUG org.springframework.ws.transport.http.MessageDispatcherServlet:966 - Successfully completed request 
09 Jan 2014 12:21:44,877 DEBUG org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter:154 - Closing JPA EntityManager in OpenEntityManagerInViewFilter 
09 Jan 2014 12:21:44,878 DEBUG org.springframework.orm.jpa.EntityManagerFactoryUtils:338 - Closing JPA EntityManager 

Что мне не хватает? Почему исходная отображаемая конечная точка не найдена?

+0

Отправьте запрос, сделанный вами. –

+0

добавлен SOAP-запрос – actc

+0

Вы ожидаете, что отображение полезной нагрузки сообщения будет реагировать на действие мыла ... Полезная нагрузка! = SoapAction ... –

ответ

0

Наконец-то я понял, что SOAP-UI использовал неправильное пространство имен при разборе WSDL. Правильное сообщение с запросом:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:webservice.x.com:wsdl"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <urn:ping/> 
    </soapenv:Body> 
</soapenv:Envelope> 
Смежные вопросы