2011-08-11 6 views
0

grailsアプリケーションで最初のSOAP Webサービスを契約するのに最適な方法は何ですか?私は2つのプラグインが最初のWebサービスの契約書を書くために利用可能であることが分かった1. Grails Metro Plugin 2. Grails SpringWS Plugin。grailsの最初のSOAP Webサービスを契約してください

しかし、私は契約まず、Webサービスのために使用するのが最適であるかわからないんだけど

答えて

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> 

そして、I c春-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> 

をreatedさて、これはGrailsのでは、あなたの春のWS契約最初のエンドポイントを与えます。

0

かなり古い投稿ですが、他人を助けるかもしれません。

代わりにweb.xmlファイルを変更できるようにテンプレートをインストールするので、あなたはまた、スクリプトで動的にMessageDispatcherサーブレットとそのマッピングを追加処理することができます/ _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) 
    } 
}