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等は適当。ここでは以下のようにした。
groupId | net.yasuabe.studies.spring.ws |
artifactId | ex1 |
version | 0.0.1-SNAPSHOT |
Package | net.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 件のコメント:
コメントを投稿