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

标签 java web-services soap glassfish spring-ws

这对我来说似乎有点奇怪 - 我有一个非常基本的 SOAP 服务,它是在 Spring-WS 中构建的,可以在 Tomcat 7 容器中部署和运行得很好。我最近一直在试验 Glassfish 4 并试图让这个 SOAP 服务正常工作,但每次我尝试通过 SoapUI 测试调用时都会得到“405 方法不允许”。

有没有人对可能导致这种情况的原因有任何建议?这是部署到两个容器中的完全相同的 WAR - 我所做的唯一更改是对我的服务层中的数据源 JNDI 查找进行了调整,其他一切都是相同的。

真正奇怪的是,当部署在 Glassfish 中时,它将提供 WSDL(即 localhost:8080/user-soap-service/user.wsdl),所以我知道应用程序已部署/监听该 URL - 它似乎只是拒绝让任何 POST 通过它。

这是我的 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 中部署时的外观,它们是相同的。有人对可能发生的事情有任何想法吗?

更新 这确实出乎意料,但它与老式的 curl 配合得很好(我之前曾使用 SoapUI 进行过测试)。我现在将重点研究 SoapUI 如何构建其调用与我使用 curl 所做的事情。

最佳答案

经过一些实验,这里的关键似乎是我的 Spring wsdl 定义的“locationUri”属性。

当部署到 Tomcat 中(7.0.54 是我当前使用的版本)时,应用程序似乎一点也不关心您是否正在向 localhost:8080 发送请求(通过 SoapUI 或 curl)/user-soap-servicelocalhost:8080/user-soap-service/ - “locationUri”属性在这个意义上似乎一点都不重要(即我得到无论我是否放置了尾随/,行为都完全相同。

当部署到 Glassfish(我目前使用的是第 4 版)时,我得到了截然不同的行为。无论我是否在我的配置中使用了尾随/,使用 localhost:8080/user-soap-service 通过 curl 发出请求都会给我一个 303。通过 SoapUI 发出请求同样的 URL 会给我一个 405!添加斜杠 - 即 localhost:8080/user-soap-service/ - 使我可以使用 curl 或 SoapUI 成功调用。

基本上,到目前为止,我的测试似乎表明“locationUri”属性不做下蹲 - 无论我是否在该属性的 URL 末尾使用尾随/,我都会得到相同的行为或不。但是,它在 SoapUI 如何构造您的默认请求方面有很大的不同,因为它构造 URL 以根据您提供的 WSDL 发送请求 - 即:

<wsdl:service name="UserService">
    <wsdl:port binding="tns:UserSoap11" name="UserSoap11">
        <soap:address location="http://localhost:8080/user-soap-service/"/>
    </wsdl:port>
</wsdl:service>

我要从这个故事中汲取的教训是始终在 Spring WSDL 定义 bean 的“locationUri”属性上使用尾部斜杠,因为 - 根据您选择的容器和测试工具,这可以产生很大的影响您的测试是否通过的差异。

另外,不要低估旧式 curl 在发现您忽略的明显事物方面的力量!

关于java - 当部署在 Glassfish 中时,基于 Spring-WS 的 SOAP 服务返回 405,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24518033/

相关文章:

java - 有人用过pubchemdb吗?有类似的API吗?

c# - Web 服务连接被取消

javascript - 谷歌地图未显示在网页上但显示在本地主机上

android - 如何在android中使用webservices?

php - 从远程系统在 apache 中安装 SOAP 扩展

java - 无法替换节点值

java - 从一个类调用静态方法到 jframe 类

java - 无法启动 Android Studio

java - Cassandra key 缓存为空

python - 如何从 suds 响应中获取未解析的 XML,以及用于存储的最佳 Django 模型字段