java - Spring MVC Web 服务调度程序

标签 java web-services model-view-controller spring jakarta-ee

我正在尝试构建集成在 DispatcherServlet 中而不是 MessageDispatcherServlet 的 Web 服务,根据 Spring ws 这是可能的。我只是想按照教程学习并根据教程实现代码。

Tomcat 正常启动。但是,当我尝试使用 http://[host]/[project]/holidayService/访问 Web 服务时出现 404 页我做错了什么?

这是我的实现:

<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 [org.springframework.ws.server.MessageDispatcher@68487fb7] 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

最佳答案

我不熟悉 Spring 网络服务,但请注意您的 DispatcherServlet 未映射到 /holidayService

像这样:

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

您还需要配置 MessageDispatcher 的映射,如 5.3.2. Wiring up Spring-WS in a DispatcherServlet 中所述.

关于java - Spring MVC Web 服务调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4183943/

相关文章:

entity-framework - 没有给出与所需的形式参数“GenericRepository <Incident> .context的上下文”相对应的参数。GenericRepository(dbContext)

c# - ASP.NET MVC : How do I validate a model wrapped in a ViewModel?

java - 如何根据第一个 Activity 数据(单击单选按钮)从第二个 Activity 转到第三个 Activity 或第四个 Activity ?

Java EE、Web 服务客户端、Java

java - 获取resources文件夹下所有文件列表

asp.net - 访问 CRM/Sharepoint Web 服务中的 DefaultCredentials

spring - 如何确保 https 仅用于 apache tomcat 中的某些 Web 服务

php - 使用url检索图片出错

java - 将通用类型列表添加到另一个

model-view-controller - MVC 与敏捷不一致吗?