Сервис SOAP на основе Spring-WS возвращает 405 при развертывании в Glassfish

Мне это кажется немного странным - у меня есть очень простая служба 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>

Все развертывается нормально (без ошибок / предупреждений), и если я сравниваю WSDL, обслуживаемый при развертывании в Tomcat, с тем, как он выглядит, когда он развертывается в Glassfish, они идентичны. Есть ли у кого-нибудь мысли по поводу того, что может происходить?

ОБНОВЛЕНИЕ. Это действительно неожиданно, но отлично работает со старомодным завитком (ранее я тестировал с SoapUI). Теперь я собираюсь сосредоточить свое исследование на том, как SoapUI строит свой вызов по сравнению с тем, что я делаю с помощью curl.


person Nick    schedule 01.07.2014    source источник


Ответы (2)


После некоторых экспериментов ключевым моментом здесь оказывается свойство "locationUri" моего определения Spring wsdl.

При развертывании в Tomcat (7.0.54 - это версия, которую я сейчас использую), приложение, похоже, совершенно не заботится о том, отправляете ли вы запросы (через SoapUI или curl) на localhost:8080/user-soap-service или localhost:8080/user-soap-service/ - свойство "locationUri" в этом смысле, похоже, не имеет значения (т.е. я получаю точно такое же поведение, независимо от того, поставил ли я конечный / или нет).

При развертывании в Glassfish (сейчас я использую версию 4) я получаю совершенно другое поведение. Независимо от того, использовал ли я конечный / в своей конфигурации или нет, выполнение запроса через curl с использованием localhost:8080/user-soap-service даст мне 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>

Мораль истории, которую я извлекаю из этого, состоит в том, чтобы всегда использовать завершающую косую черту в свойстве "locationUri" компонента определения Spring WSDL, потому что - в зависимости от выбранного вами контейнера и инструмента тестирования это может иметь большое значение в том, будет ли пройдут ваши тесты или нет.

Кроме того, не сбрасывайте со счетов способность старых добрых завитков раскрыть то очевидное, что вы упускаете из виду!

person Nick    schedule 02.07.2014
comment
Рад, что ты сам это понял! У меня были и другие проблемы с этим, особенно когда вы начинаете развертывать одну и ту же WAR в разных средах. Я решил эту проблему, используя относительный URL-адрес типа /service вместо абсолютного, как вы описываете. - person evandongen; 03.07.2014

Это также может произойти, если вы отправляете свой запрос с использованием http, в то время как разрешен только https

person pma    schedule 04.09.2014