2010-11-15 84 views
2

我试图构建集成在DispatcherServlet中的Web Service,根据Spring的ws,它可能包含MessageDispatcherServlet。我只是按照教程跟随教程和实现代码。Spring MVC Web服务调度程序

Tomcat正常启动。不过,我有404页,当我尝试使用HTTP访问Web服务:// [主持人]/[项目]/holidayService /我“米做错了

这是我实现:

<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> 

doolloop-servlet.xml中的相关部分如下:

<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> 

现在的EndPoint看起来是这样的:

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; 
    } 
} 

旁边我有服务实现,但我不认为它是相关的,我有一种感觉,它与Dispatcher servlet有关,但我不知道问题是什么。

我增加了后续

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

这是我的log4j的文件显示:

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 

回答

2

我不熟悉Spring Web的服务,但请注意,您的DispatcherServlet没有映射到/holidayService

事情是这样的:

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

您还需要在5.3.2. Wiring up Spring-WS in a DispatcherServlet描述配置的MessageDispatcher映射。

+0

看起来你是对的,但我不知道如何将它与MessageDispatcherServlet一起映射 – 2010-11-15 12:30:43

+0

我知道我可以使用messageDispather,但我有整个应用程序使用分派器,我希望我的WS绑定到休眠会话bean和我在那里的所有逻辑。 – 2010-11-15 12:43:22

+0

我的意思是'MessageDispatcher',而不是'MessageDispatcherServlet'。 – axtavt 2010-11-15 12:52:44