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 の仕組みを知る サンプルの目的 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と共に配布されている
サーバのプログラム(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