当在Glassfish中部署时,基于Spring-WS的SOAP服务返回405

时间:2014-07-01 19:39:46

标签: java web-services soap glassfish spring-ws

这个对我来说有点奇怪 - 我有一个非常基本的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如何构建它的调用与我正在做的卷曲。

2 个答案:

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

,也可能会发生这种情况