WADL とアノテーション処理

WebサービスII (第10回)
2007年11月28日
植田龍男
本日の目的





RESTful なwebサービスの提供(続き)
参照実装の提供 – Jerseyプロジェクト
Webサービスの統合と規格化
WADL(Web Application Definition
Language)
Jersey でのアノテーション処理( apt )
前回までやったこと
RESTfulなWebサービスとは?
それへのアクセス(JAXB)
Webサービスの開発
Jerseyプロジェクトとは?
HelloWorldの実現
UriTemplate – RESTful の拡張
前回から取り組んでいること


RESTful な Webサービスのサーバ側
JAX-WS の枠組みの中に構築
POJO + アノテーションのスタイル
サービスのサンプル
@UriTemplate("/helloworld")
public class HelloWorldResource {
@HttpMethod("GET")
@ProduceMime("text/plain")
public String getClichedMessage() {
return "Hello World!";
}
}
サービスのコンパイル

ライブラリ jsr311-api.jar をクラスパスに指定
javac -cp ~/jersey-0.4-ea/lib/jsr311-api.jar
HelloWorldResouce.java
今回追加したいこと



WADLファイルの自動生成
WADLの情報を提供するサービス
Jersey の枠組みでは、POJOに付加され
たアノテーションから自動生成
アノテーションの処理の仕組み



アノテーションを解釈する専用のクラス
「プロセッサ」
プロセッサを呼び出すもの
javac コマンド( Java SE 6 )
apt コマンド ( J2SE 5.0 )
Jersey 0.4 は J2SE 5.0 + apt で実装
apt とは何か?
Annotation Processing Tool
 J2SE 5.0 から追加されたコマンド apt
(javac, javadoc に関連あり)
 メタデータを解釈・処理するプロセッサを
呼び出す
 ソースファイルとメタデータを解析
 ソース、関連ファイルの自動生成等

apt を使うために用意するもの




メタデータを含むソースファイル(処理対象)
Annotation Processor のクラス
(メタデータを解釈し、処理する)
Annotation Processor Factory のクラス
(Processorを提供する)
com.sun.mirror の4つのパッケージ
( $JAVA_HOME/lib/tools.jar の中)
サンプル1:
Processor の仕組みを知る

1.
2.
3.
4.
サンプルの目的
AnnotationProcessor の実装
AnnotationPorcessorFactory の実装
aptによる実行の手順
AnnotationProcesor が利用するクラス(イン
タフェース)の意味と利用方法
サンプル1:
ProcessorAnnotation の実装



com.sun.mirror.apt.AnnotationProcessor
インタフェースを実装する
public void process() { }
処理内容を記述
コンストラクタの定義
AnnotationProcessor は単独では利用で
きない(AnnotationProcessorFactoryが必
要)
サンプル1:
FirstProcessorの処理
public void process() {
//ソース内にあるAnnotationの一覧
for( AnnotationTypeDeclaration atd : atds )
System.out.println( atd );
//解析対象のクラス
for( TypeDeclaration td :
env.getSpecifiedTypeDeclarations() )
System.out.println( td );
}
サンプル1:
実行までの手順
apt に ProcessorFactory のクラスを指定
-factory または –factorypath
例) apt –factory FirstProcessorFactory
InfoAnnotated.java
 注)現行では $JAVAHOME/lib/tools.jar
をクラスパスに指定する必要あり
set CLASSPATH=C:\j2sdk1.5.0\lib
\tools.jar;.

apt + プロセッサでできること





ソースファイルの解析
アノテーションの情報の解釈
データファイルの自動生成
ソースファイルの自動生成
ソースのコンパイル( javac に処理を渡す)
Java SE 6以降の流れ



新しく、より使いやすいAPI (JSR 251)
Factoryのクラスは不要
apt なしで javac 単独で処理が可能
http://www.wakhok.ac.jp/~tatsuo/summer2006/
Jersey の自動処理
HelloWorldService を記述するWADLが
自動生成
com/sun/ws/rest/wadl/resource
の下に application.wadl
 同じディレクトリに
WadlResouce のソースとバイトコード生成
=>application.wadlの情報を提供する

サービスを確認するには?


Webサーバと 「コンテナ」が必要
今回は Jerseyと共に配布されている
軽量Webサーバにプログラムを直接組み
込む
サーバのプログラム(1)
public class Main4 {
public static void main(String[] args) {
HttpHandler handler =
ContainerFactory.createContainer(
HttpHandler.class,
hello.HelloWorldResource.class
com.sun…resource.WadlResouce.class);
サーバのプログラム(2)
HttpServer server = HttpServer.create(
new InetSocketAddress(9998), 0);
server.createContext("/", handler);
server.setExecutor(null); server.start();
:
サーバのコンパイルと実行

ant もしくはシェルスクリプトで構築
#!/bin/bash LIB=~/jersey-0.4-ea/lib
javac -classpath.:$LIB/activation.jar:
$LIB/ant.jar:$LIB/comresrcgen.jar:
$LIB/grizzly-1.0.13.jar:$LIB/http.jar:
$LIB/jaxb-api.jar:$LIB/jaxb-impl.jar ….
確認

ブラウザからアクセス
http://localhost:9998/helloworld
http://localhost:9998/application.wadl
まとめ:開発の手順の比較(1)


Java SE 6 の SOAP型の開発
@Webservice アノテーションが付加され
た POJO からスタート
Jersey の RESTful 型の開発
@UriTemplate, @HttpMethod が付加さ
れた POJO からスタート
まとめ:開発手順の比較(2)


SOAP型
ツール wsgen によるソースとWSDLの自
動生成 => サーバが公開
http://sitename/servicename?wsdl
RESTful型
apt + 専用のプロセッサによるソースと
WADLの自動生成=>RESTfulサービスで
公開
http://sitename/applicaiton.wadl