CXF で RESTful Web サービスを書いて、Eclipse で動かしてみる getting started。
■ 使うもの
・Eclipse 3.5 Galileo + m2eclipse
■ やりたい事
JSR 311準拠の REST を、CXF を使ってやってみる。
JSR 311: JAX-RS: Java API for RESTful Web Services
疎通確認程度の、なるべくコンパクトなコードにしたいが、GET だけだとアレなので PUT での更新も試してみる。
方針としては、簡易サーバ上のサービスに対して、ブラウザで GET して、HttpClient を使ったクライアントで PUT する。
■ プロジェクト作成- archetype-maven-quickstart で Maven Projectを作る。
- pom.xml に 以下を追加
org.apache.cxf | cxf-rt-frontend-jaxrs | 2.2.5 |
org.apache.cxf | cxf-rt-transports-http | 2.2.5 |
org.apache.cxf | cxf-rt-transports-http-jetty | 2.2.5 |
commons-httpclient | commons-httpclient | 3.1 |
■ サーバアプリ作成
◆ やり取りする REST メッセージは以下の二つ
@XmlRootElement(name = "Message")
public class Message {
private String text;
// ・・・ getter/setter 略
public void setText(String greeting, String name) {
setText(String.format("%1$s, %2$s!", greeting, name));
}
}
@XmlRootElement(name = "Greeting")
public class Greeting {
private String word;
// ・・・ getter/setter 略
}
◆ サービスクラスはこんな感じ
@Path("/greetingservice/")
public class GreetingService {
private String greeting = "Hello";
@GET
@Path("/greeting/{name}/")
public Message getMessage(@PathParam("name") String name) {
Message hello = new Message();
hello.setText(greeting, name);
return hello;
}
@PUT
@Path("/greeting/")
public Response updateGreeting(Greeting greeting) {
this.greeting = greeting.getWord();
return Response.ok().build();
}
}
◆ このサービスクラスを動かす簡易サーバ
public class App {
public static void main(String[] args) throws Exception {
JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
sf.setResourceClasses(GreetingService.class);
sf.setResourceProvider(GreetingService.class,
new SingletonResourceProvider(new GreetingService()));
sf.setAddress("http://localhost:9000/");
sf.create();
new BufferedReader(new InputStreamReader(System.in)).readLine();
System.exit(0);
}
}
◆ 動作確認
GET だけならこの時点でブラウザから確認できる。
http://localhost:9000/greetingservice/greeting/World
こんなXML が返ってくる
<Message>
<text>Hello, World!</text>
</Message>
あるいは URL がこうならば、、
http://localhost:9000/greetingservice/greeting/Europa
、、このようになる。
<Message>
<text>Hello, Europe!</text>
</Message>
■ クライアントコード
◆コード
public final class Client {
public static void main(String args[]) throws Exception {
PutMethod put = new PutMethod(
"http://localhost:9000/greetingservice/greeting");
String content = String.format(
"<Greeting><word>%s</word></Greeting>", args[0]);
RequestEntity entity =
new StringRequestEntity(content, "text/xml", "UTF-8");
put.setRequestEntity(entity);
try {
HttpClient httpclient = new HttpClient();
int result = httpclient.executeMethod(put);
System.out.println("Response status code: " + result);
} finally {
put.releaseConnection();
}
}
}
◆ 実行
サーバが起動されている状態で、Program Argument に "Good-Bye"を指定して、上記クライアント・コードを実行。正常終了すれば、PUT リクエストが送られたことになる。
ここで再び、ブラウザから http://localhost:9000/greetingservice/greeting/Asia に GET リクエストを送る。
<Message>
<text>Good-Bye, Asia!</text>
</Message>
今度は Hello ではなくGood-Bye と表示されるのが確認できる。
■ 所感- いい感じの EoD で、上のような疎通確認程度ならほとんど勘で充分。
- 他の CRUD も同じ要領でできそう。
- 今回、CFX 付属の sample を参考にして、JAXRSServerFactoryBean で Server endpoints を生成する簡易サーバで動かしたが、Web アプリにするやり方も確認したい。