контракт первый мыльный веб-сервис в Grails - PullRequest
0 голосов
/ 11 августа 2011

Каков наилучший способ написания контракта сначала веб-службы SOAP в приложении Grails?Я обнаружил, что есть два плагина, доступных для написания первого веб-сервиса контракта 1. Плагин Grails Metro 2. Плагин Grails SpringWS.

Но я не уверен, какой из них лучше использовать для первого контракта веб-сервиса

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

Плагин Grails SpringWS больше не поддерживается автором, и никто не подхватил поддержку.Если он работает для вас как есть, он работает довольно хорошо.Как только вам нужно настроить или вы обнаружите ошибку, вы по своему усмотрению.

В итоге я использовал SpringWS и просто импортировал зависимости вручную.Вот мой раздел зависимостей в BuildConfig.groovy:

    dependencies {
    runtime('org.springframework.ws:spring-ws:2.0.3.RELEASE')
    runtime('org.springframework.ws:spring-ws-core:2.0.3.RELEASE')
    runtime('org.springframework.ws:spring-ws-security:2.0.3.RELEASE')
    runtime('org.springframework.ws:spring-ws-support:2.0.3.RELEASE')
    runtime('org.springframework.ws:spring-xml:2.0.3.RELEASE')
    runtime('com.sun.xml.wsit:wsit-rt:1.1')
    runtime('commons-httpclient:commons-httpclient:3.0.1')
    test('com.github.robfletcher:betamax:1.0')
    }

И затем определите клиента следующим образом:

import org.springframework.ws.transport.http.CommonsHttpMessageSender


beans = {
    myMarshaller(org.springframework.oxm.jaxb.Jaxb2Marshaller) {
        contextPath = "com.the.jaxb.beans.to.marshall"
    }
wss4jSecurityInterceptor(org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor) {
        securementActions = "UsernameToken"
        securementPasswordType = "PasswordText"
    }

    myInterfaceTemplate(org.springframework.ws.client.core.WebServiceTemplate) {
        marshaller = ref("myMarshaller")
        unmarshaller = ref("myMarshaller")
        messageSender = { CommonsHttpMessageSender ms -> }
        interceptors = [wss4jSecurityInterceptor]
        defaultUri = ""
    }
}

Итак, вы делаете

grails install-templates

настроить ваш web.xml:

    <servlet>
    <servlet-name>spring-ws</servlet-name>
    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
    <init-param>
        <param-name>transformWsdlLocations</param-name>
        <param-value>true</param-value>
    </init-param>

    <load-on-startup>1</load-on-startup>

        </servlet>
        <servlet-mapping>
            <servlet-name>spring-ws</servlet-name>
            <url-pattern>/services/*</url-pattern>
        </servlet-mapping>

И я создал spring-ws-servlet.xml

<context:component-scan base-package="com.bean.base.package"/>

<bean id="myTypes" class="org.springframework.xml.xsd.SimpleXsdSchema">
    <property name="xsd" value="/WEB-INF/Types.xsd"/>
</bean>

<bean id="ContractFirstBeanName" class="org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition"
      p:wsdl="/WEB-INF/ContractFirstBeanName.wsdl"/>

<bean class="org.springframework.ws.transport.http.XsdSchemaHandlerAdapter"/>

<bean id="outputMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"
      p:contextPath="com.output.beans"/>

<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
    <property name="interceptors">
        <list>
            <bean id="loggingInterceptor"
                  class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor">
                <property name="logRequest" value="true"/>
                <property name="logResponse" value="true"/>
            </bean>
            <ref local="wsSecurityInterceptor"/>
        </list>
    </property>
</bean>

<bean class="org.springframework.ws.transport.http.WsdlDefinitionHandlerAdapter">
    <property name="transformLocations" value="true"/>
</bean>

<bean class="org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter">
    <property name="messageFactory">
        <bean class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"/>
    </property>
</bean>

<bean class="org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter">
    <constructor-arg ref="outputMarshaller" index="0"/>
</bean>
<bean id="wsSecurityInterceptor"
      class="org.springframework.ws.soap.security.xwss.XwsSecurityInterceptor">
    <property name="policyConfiguration" value="/WEB-INF/securityPolicy.xml"/>
    <property name="callbackHandlers">
        <list>
            <ref bean="springWSSecurityHandler"/>
        </list>
    </property>
</bean>
<bean id="springWSSecurityHandler"
      class="org.springframework.ws.soap.security.xwss.callback.SpringPlainTextPasswordValidationCallbackHandler">
    <property name="authenticationManager" ref="authenticationManager"/>
</bean>

Теперь это даст вам сначала Spring WS контрактконечные точки, в Grails.

0 голосов
/ 08 декабря 2014

Довольно старый пост, но может помочь другим.

В дополнение к посту Роба:

Вместо установки шаблонов для возможности изменения файла web.xml вы также можете обрабатывать добавление сервлета MessageDispatcher и его отображение динамически в scripts / _Events.groovy:

eventWebXmlEnd = { String tmpfile ->
    GPathResult root = new XmlSlurper().parse(webXmlFile)
    GPathResult servlets = root.servlet
    servlets[servlets.size() - 1] + {
       'servlet' {
           'display-name'("web-services")
           'servlet-name'("web-services")
           'servlet-class'("org.springframework.ws.transport.http.MessageDispatcherServlet")
       }
    }
    def servletMappings = root.'servlet-mapping'
    servletMappings[servletMappings.size() - 1] + {
       'servlet-mapping' {
           'servlet-name'("web-services")
           'url-pattern'("/services/*")
       }
    }
    // update web.xml content
    webXmlFile.text = new StreamingMarkupBuilder().bind {
       mkp.declareNamespace("":"http://java.sun.com/xml/ns/javaee")
       mkp.yield(root)
    }
}
...