Spring WS和MessageDispatcherServlet:如何定义WSDL的确切URL?

时间:2013-11-16 22:03:56

标签: java servlets wsdl spring-ws

我正在使用

运行独立应用程序(没有Web应用程序容器)
  • Spring 3.2.4
  • Spring-WS 2.1.4
  • Jetty 8.1.13(嵌入式码头)

我已经设置了嵌入了这样的servlet上下文的Jetty:

<bean id="servletContext" class="org.eclipse.jetty.servlet.ServletContextHandler">
  <property name="contextPath" value="/" />
  <property name="servletHandler">
    <bean class="org.eclipse.jetty.servlet.ServletHandler">
      <property name="servlets">
        <list>
          <bean class="org.eclipse.jetty.servlet.ServletHolder" p:name="dispatcherServlet" p:servlet-ref="dispatcherServlet" />
          <bean class="org.eclipse.jetty.servlet.ServletHolder" p:name="messageDispatcherServlet" p:servlet-ref="messageDispatcherServlet" />
        </list>
      </property>
      <property name="servletMappings">
        <list>
          <bean class="org.eclipse.jetty.servlet.ServletMapping" p:pathSpec="/services" p:servletName="dispatcherServlet" />
          <bean class="org.eclipse.jetty.servlet.ServletMapping" p:pathSpec="/ws/*" p:servletName="messageDispatcherServlet" />
        </list>
      </property>
    </bean>
  </property>
</bean>

<bean id="dispatcherServlet" class="org.springframework.web.servlet.DispatcherServlet">
  <constructor-arg>
        <bean class="org.springframework.web.context.support.XmlWebApplicationContext">
            <property name="configLocation" value="classpath:/dispatcherServlet-context.xml" />
        </bean>
    </constructor-arg>
</bean>

<bean id="messageDispatcherServlet" class="org.springframework.ws.transport.http.MessageDispatcherServlet">
    <constructor-arg>
        <bean class="org.springframework.web.context.support.XmlWebApplicationContext">
            <property name="configLocation" value="classpath:/messageDispatcherServlet-context.xml" />
        </bean>
    </constructor-arg>
</bean>

如您所见,定义了2个servlet,第一个是

org.springframework.web.servlet.DispatcherServlet

,第二个是

org.springframework.ws.transport.http.MessageDispatcherServlet

那些有两个单独的spring context config xml文件(XmlWebApplicationContext):

的DispatcherServlet-context.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<beans
  [... xmlns etc. here ...]
  >

  <bean name="/test" class="com.mycompany.TestHttpRequestHandler" />

</beans>

messageDispatcherServlet-context.xml中

<?xml version="1.0" encoding="UTF-8"?>
<beans
  [... xmlns etc. here ...]
  >

  <bean class="com.mycompany.TestWebServiceEndpoint" />

  <bean name="TestWebService" class="org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition">
    <property name="wsdl">
      <bean class="org.springframework.core.io.ClassPathResource">
        <constructor-arg>
          <value>classpath:/TestWebServiceEndpoint.wsdl</value>
        </constructor-arg>
      </bean>
    </property>
  </bean>

</beans>

一切正常 - 我可以在以下网址下调用“TestHttpRequestHandler”(DispatcherServlet):

http://localhost:8181/services/test

我可以在以下URL下调用WSDL:

http://localhost:8181/ws/TestWebService.wsdl

但是(!) - 这是我的问题 - 我也可以使用网址

http://localhost:8181/ws/bar/TestWebService.wsdl

http://localhost:8181/ws/bat/foo/TestWebService.wsdl

http://localhost:8181/ws/bat/foo/whatever/TestWebService.wsdl

每次浏览器显示“TestWebService”的WSDL XML代码。

我的期望是,URL由bean名称映射,就像使用

的示例一样
<bean name="/test" class="com.mycompany.TestHttpRequestHandler" />

将其映射到http://localhost:8181/services/test

但似乎对于“MessageDispatcherServlet”,这不起作用。它只识别其上下文中的任何WSDL bean并返回它,无论用户调用的URL(只是WSDL文件的名称必须匹配)。

冗长的解释,但简短的问题:

如何在使用MessageDispatcherServlet时指定“TestWebService.wsdl”的确切(且唯一有效)URL?

非常感谢你的帮助!

0 个答案:

没有答案