2010-11-15 6 views
2

J'essaye de construire un service web intégré dans DispatcherServlet insted de MessageDispatcherServlet, selon Spring ws c'est possible. Je suis juste attachant à suivre des tutoriels et implémenter le code selon les tutoriels.Spring MVC Services Web Dispatcher

Tomcat démarre normalement. Cependant, j'ai la page 404 quand je suis en train d'accéder au service Web en utilisant http: // [hôte]/[projet]/holidayService/Ce que je "fais mal

Voici mon implémentation:

<servlet> 
    <servlet-name>doolloop</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>doolloop</servlet-name> 
    <url-pattern>*.dlp</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
    <servlet-name>doolloop</servlet-name> 
    <url-pattern>/index.dlp</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
    <servlet-name>doolloop</servlet-name> 
    <url-pattern>/scene/*</url-pattern> 
    </servlet-mapping> 

la partie pertinente de doolloop-servlet.xml est la suivante:

<tx:annotation-driven /> 
<mvc:annotation-driven /> 
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"/> 
    <bean class="org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter"> 
<property name="messageFactory" ref="messageFactory"/> 
</bean> 
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
     <property name="defaultHandler" ref="messageDispatcher"/> 
    </bean> 

    <bean id="messageDispatcher" class="org.springframework.ws.server.MessageDispatcher"/> 

    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 
<bean id="holidayEndpoint" class="com.doolloop.services.HolidayEndpoint"> 
    <constructor-arg ref="hrService" /> 
    </bean> 
    <bean id="hrService" class="com.doolloop.services.StubHumanResourceService" /> 
    <bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping"> 
    <property name="mappings"> 
    <props> 
    <prop key="{http://mycompany.com/hr/schemas}HolidayRequest">holidayEndpoint</prop> 
    </props> 
    </property> 
    <property name="interceptors"> 
    <bean class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor" /> 
    </property> 
    </bean> 
    <bean id="holiday" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition"> 
    <property name="schema" ref="schema" /> 
    <property name="portTypeName" value="HumanResource" /> 
    <!-- we use a relative uri that will be transformed by spring-ws dep 
    --> 
    <property name="locationUri" value="holidayService/" /> 
    <property name="targetNamespace" value="http://mycompany.com/hr/definitions" /> 
    </bean> 
    <bean id="schema" class="org.springframework.xml.xsd.SimpleXsdSchema"> 
    <property name="xsd" value="/WEB-INF/hr.xsd" /> 
    </bean> 

maintenant, le EndPoint ressemble à ceci:

public class HolidayEndpoint extends AbstractJDomPayloadEndpoint { 

    private XPath startDateExpression; 
    private XPath endDateExpression; 
    private XPath nameExpression; 
    private HumanResourceService humanResourceService; 

    public HolidayEndpoint(HumanResourceService humanResourceService) throws JDOMException { 
     this.humanResourceService = humanResourceService; 
     Namespace namespace = Namespace.getNamespace("hr", "http://mycompany.com/hr/schemas"); 
     startDateExpression = XPath.newInstance("//hr:StartDate"); 
     startDateExpression.addNamespace(namespace); 
     endDateExpression = XPath.newInstance("//hr:EndDate"); 
     endDateExpression.addNamespace(namespace); 
     nameExpression = XPath.newInstance("concat(//hr:FirstName,' ',//hr:LastName)"); 
     nameExpression.addNamespace(namespace); 
    } 

    protected Element invokeInternal(Element holidayRequest) throws Exception { 
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
     Date startDate = dateFormat.parse(startDateExpression.valueOf(holidayRequest)); 
     Date endDate = dateFormat.parse(endDateExpression.valueOf(holidayRequest)); 
     String name = nameExpression.valueOf(holidayRequest); 

     humanResourceService.bookHoliday(startDate, endDate, name); 
     return null; 
    } 
} 

à côté j'ai l'implémentation du service, mais je ne pense pas que ce soit pertinent et j'ai le sentiment que cela a quelque chose à voir avec le servlet Dispatcher, mais je n'ai aucune idée de quel est le problème.

J'ai ajouté le suivi

<servlet-mapping> 
    <servlet-name>doolloop</servlet-name> 
    <url-pattern>/holidayService/*</url-pattern> 
    </servlet-mapping> 

Voici ce que mon fichier log4j montre:

2010-11-15 15:27:07,969 DEBUG [org.springframework.web.servlet.DispatcherServlet] - DispatcherServlet with name 'doolloop' processing GET request for [/dlp/holidayService/] 
2010-11-15 15:27:07,969 DEBUG [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] - Mapping [/] to HandlerExecutionChain with handler [[email protected]] and 2 interceptors 
2010-11-15 15:27:07,970 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Last-Modified value for [/dlp/holidayService/] is: -1 
2010-11-15 15:27:07,970 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Null ModelAndView returned to DispatcherServlet with name 'doolloop': assuming HandlerAdapter completed request handling 
2010-11-15 15:27:07,970 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Successfully completed request 

Répondre

2

Je ne suis pas familier avec les services web de printemps, mais notez que votre DispatcherServlet n'est pas mappée à /holidayService.

Quelque chose comme ceci:

<servlet-mapping> 
    <servlet-name>doolloop</servlet-name> 
    <url-pattern>/holydayService/*</url-pattern> 
</servlet-mapping> 

Vous devez également configurer le mappage de MessageDispatcher comme décrit dans 5.3.2. Wiring up Spring-WS in a DispatcherServlet.

+0

On dirait que vous avez raison, mais je n'ai aucune idée de comment le mapper avec MessageDispatcherServlet –

+0

Je sais que je peux utiliser messageDispather, mais j'ai toute l'application en utilisant Dispatcher et je voudrais avoir mon WS lié à Hibernate Session bean et toute la logique que j'ai là. –

+0

Je veux dire 'MessageDispatcher', pas' MessageDispatcherServlet'. – axtavt