这个对我来说有点奇怪 - 我有一个非常基本的SOAP服务,它构建在Spring-WS中,可以部署和使用它。在Tomcat 7容器内运行得很好。我最近一直在试验Glassfish 4&试图让这个SOAP服务工作但每次我尝试通过SoapUI测试一个呼叫时都会得到“405 Method Not Allowed”。
有没有人对可能导致这种情况的原因有什么建议?它与部署在两个容器中的WAR完全相同 - 我所做的唯一更改是对服务层中的数据源JNDI查找进行调整,其他一切都相同。
真正奇怪的是,当部署在Glassfish中时,它将提供WSDL(即localhost:8080/user-soap-service/user.wsdl
),因此我知道应用程序是在该URL上部署/侦听的 - 它只是拒绝让任何通过它发布似乎。
这是我的web.xml:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>user-soap-service</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>user-soap-service</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
这是我的应用程序上下文:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config/>
<import resource="classpath:user-service.xml"/>
<bean id="userService" class="com.myorg.service.user.services.UserServiceBean"/>
<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping"/>
<bean id="userEndpoint" class="com.myorg.api.endpoints.UserMarshallingEndpoint"/>
<bean class="org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter">
<property name="marshaller" ref="marshaller"/>
<property name="unmarshaller" ref="marshaller"/>
</bean>
<bean id="marshaller" class="org.springframework.oxm.castor.CastorMarshaller">
<property name="mappingLocation" value="classpath:mapping.xml"/>
</bean>
<bean id="user" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">
<property name="schema">
<bean class="org.springframework.xml.xsd.SimpleXsdSchema">
<property name="xsd" value="/WEB-INF/user.xsd"/>
</bean>
</property>
<property name="portTypeName" value="User"/>
<property name="locationUri" value="http://localhost:8080/user-soap-service"/>
</bean>
</beans>
所有部署都很好(没有错误/警告),如果我比较在Tomcat中部署时提供的WSDL与在Glassfish中部署时看起来的样子,它们是相同的。有没有人对可能发生的事情有任何想法?
更新 这真的是意料之外的,但它适用于良好的老式卷曲(我以前使用SoapUI进行测试)。我现在要集中研究SoapUI如何构建它的调用与我正在做的卷曲。
答案 0 :(得分:2)
经过一些实验,这里的关键似乎是&#34; locationUri&#34;我的Spring wsdl定义的属性。
当部署到Tomcat(7.0.54是我目前正在使用的版本)时,如果您要将请求(通过SoapUI或curl)发送到{{{},则应用程序似乎无关紧要。 1}}或localhost:8080/user-soap-service
- &#34; locationUri&#34;在这个意义上,财产似乎并不重要(即,无论我是否设置了尾随,我都会得到完全相同的行为)。
当部署到Glassfish(我当前正在使用版本4)时,我的行为会有很大不同。无论我是否在我的配置中使用了尾随/,使用localhost:8080/user-soap-service/
通过curl发出请求都会给我一个303.通过SoapUI针对同一个URL发出请求会给我一个405!添加斜杠 - 即localhost:8080/user-soap-service
- 使用curl或SoapUI给我一个成功的调用。
基本上,到目前为止,我的测试似乎表明&#34; locationUri&#34;财产不会蹲下 - 无论我是否在该属性的URL末尾使用了尾随/,我都会得到相同的行为。但是,它在SoapUI构造默认请求的方式上有很大的不同,因为它构造了基于您提供的WSDL来发送请求的URL - 即:
localhost:8080/user-soap-service/
我从这里得到的故事的寓意是总是在Spring WSDL定义bean上使用尾随斜杠&#34; locationUri&#34;属性因为 - 取决于你的容器和&amp;选择测试工具,这可以对您的测试是否通过产生重大影响。
另外,不要贬低好旧卷发的力量,以发现一些你忽略的东西!
答案 1 :(得分:1)
如果您使用http发送请求,而只允许使用https
,也可能会发生这种情况