2009年12月20日日曜日

Spring Web Service/m2eclipse/WTP

Spring Web Service を Eclipse で使い始めるときのざっくりレシピ。 使用プロダクトは以下のようなもの。
  • Eclipse 3.5 Galileo
  • m2eclipse 0.9.8 (Maven 2.2.1)
  • WTP 3.1.1
  • Apache Tomcat v6.0 (Eclipse で server runtime に設定され、さらにサーバプロジェクトに追加されている前提)
■ 手順 (作成)
  • Eclipse で spring-ws-archetype を使って Maven Project 作成。artifactId等は適当。ここでは以下のようにした。
    groupIdnet.yasuabe.studies.spring.ws
    artifactIdex1
    version0.0.1-SNAPSHOT
    Packagenet.yasuabe.studies.spring.ws.ex1
  • .project に <nature>org.eclipse.wst.common.project.facet.core.nature</nature> を追加( Navigator ビューから)。
  • プロジェクトの Properties を開いて、、、
    • Project Facet で Java と Dynamic Web Module にチェックし、Runtime タブで構成済みの Tomcat を指定
    • Java Compiler に 1.6を指定。
    • Property を一旦閉じて開きなおす。
    • Java EE Module Dependencies で Maven Dependencies にチェックを入れる
  • .settings/ 下の org.eclipse.wst.common.componentファイルを開いて、<ws-resource>の @source-pathを、/WebContentから/src/main/webappに変更する
  • WebContent フォルダを削除する。
  • /src/main/webapp/WEB-INF/下に greeting.xsd を作成する
    <?xml version="1.0" encoding="UTF-8"?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" 
       elementFormDefault="qualified" attributeFormDefault="qualified"
          targetNamespace="http://studies.yasuabe.net/spring/ws/ex1"
          xmlns:tns="http://studies.yasuabe.net/spring/ws/ex1">
    
       <element name="greetingRequest" type="string"/>
       <element name="greetingResponse" type="string"/>
    </schema>
  • /src/main/webapp/WEB-INF/下の spring-ws-servlet.xml に以下の記述を追加
    <bean id="greeting" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">
       <property name="schema" ref="schema"/>
       <property name="portTypeName" value="Greeting"/>
       <property name="locationUri" value="http://localhost:8080/ex1/greetingService"/>
    </bean>
    <bean id="payloadMapping" class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping">
       <property name="defaultEndpoint" ref="greetingEndpoint"/>
    </bean>
    <bean id="greetingEndpoint" class="net.yasuabe.studies.spring.ws.ex1.GreetingEndpoint"/>
    <bean id="schema" class="org.springframework.xml.xsd.SimpleXsdSchema">
       <property name="xsd" value="/WEB-INF/greeting.xsd"/>
    </bean>
  • 新規ソースフォルダに/src/main/java を作成して、以下のクラスを作成
    package net.yasuabe.studies.spring.ws.ex1;
    
    import org.springframework.ws.server.endpoint.AbstractDomPayloadEndpoint;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Text;
    
    public class GreetingEndpoint extends AbstractDomPayloadEndpoint {
       @Override
       protected Element invokeInternal(Element req, Document doc)
             throws Exception {
            Element responseElement = doc.createElementNS(
                  "http://studies.yasuabe.net/spring/ws/ex1", "greetResponse");
            String name = req.getFirstChild().getTextContent();
            Text responseText = doc.createTextNode(String.format("Hello,%s!", name));
            responseElement.appendChild(responseText);
    
            return responseElement;
       }
    }
■ 手順 (実行)
  • Servers ビューで Tomcat にex1 プロジェクトを追加
  • Servers ビューからTomcat サーバを [start] する
  • soapUI でプロジェクトを作成し、以下のURLのWSDLを追加
    http://localhost:8080/ex1/greetingService/greeting.wsdl
  • リクエストを投げてみて以下のようになることを確認 <リクエスト>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ex1="http://studies.yasuabe.net/spring/ws/ex1">
       <soapenv:Header/>
       <soapenv:Body>
          <ex1:greetingRequest>World</ex1:greetingRequest>
       </soapenv:Body>
    </soapenv:Envelope>
    <レスポンス>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
       <SOAP-ENV:Header/>
       <SOAP-ENV:Body>
          <greetResponse xmlns="http://studies.yasuabe.net/spring/ws/ex1">Hello,World!</greetResponse>
       </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
■ 所感
  • Spring と CXF の相性を調べている途中で、たまたま Spring Web Service を使ってみた
  • 本来の作法としては、Endpoint でリクエストを処理するのではなく DI で関連付けられた サービスに処理を委譲するのが正しいようだけど、実験の意図と関係ないので割愛した。
  • 期待したほどお手軽ってわけでもない。

0 件のコメント:

コメントを投稿