【问题标题】:contract first soap web service in grails在 Grails 中签订第一个肥皂网络服务
【发布时间】:2011-08-11 07:33:17
【问题描述】:

在 grails 应用程序中编写合同优先 SOAP Web 服务的最佳方法是什么?我发现有两个插件可用于编写合约优先 web 服务 1. Grails Metro 插件 2. Grails SpringWS 插件。

但我不确定哪个最适合用于合同优先网络服务

【问题讨论】:

    标签: web-services grails soap grails-plugin


    【解决方案1】:

    作者不再支持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>
    

    现在这将在 Grails 中为您提供 Spring WS 合同的第一个端点。

    【讨论】:

      【解决方案2】:

      相当老的帖子,但可能对其他人有所帮助。

      除了 Rob 的帖子:

      除了安装模板来修改 web.xml,您还可以在 scripts/_Events.groovy 中动态添加 MessageDispatcher servlet 及其映射:

      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)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-29
        • 2017-01-16
        • 2017-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多