JAX-RS on WebLogicMarch 21, 2013
HASUNUMA KenjiVice president, GlassFish Users Group Japan
[email protected]: @btnrouge (#wlstudy)
JAX-RSJersey
Since 2008
Introduction
HTTP (GET)
《黎明期のWorld Wide Web》ハイパーリンクによるHTML文書検索システム
HTTP (POST)
《クライアントからのデータ送信》動的HTML = Webアプリケーションの誕生
HTTP (REST)
《Webアプリケーション技術の整理・汎用化》REST (Representational State Transfer)
HTTP Status•処理の正常/異常を示す唯一の指標
• 3桁の数字
1xx 情報2xx 成功3xx 転送(リダイレクト指示など)4xx エラー(原因はクライアント)5xx エラー(原因はサーバー)
What’s REST?
RESTful Webサービスとは?
RESTの3要素に基づく
•リソース (対象)
•メソッド
•URIStatelessである…Web本来の姿
RESTの3要素 - リソース
•ネットワーク上に存在する情報URIで識別され、状態を持つ
•性質: リクエストを受け付け、その時の状態に応じてレスポンスを返す
•静的リソース: HTMLファイルなど
•動的リソース: Webアプリケーション
RESTの3要素 - メソッド
メソッド 説明GET リソースの状態を取得する
POST リソースの状態を変更するPUT リソースを追加する
DELETE リソースを削除するHEAD リソースのヘッダーを返す
OPTIONS 有効なメソッドを返す
RESTの3要素 - URI
•リソースを一意に識別する (Unified Resource Identifier)
• Unixのファイルシステムに似たパス構
造を持つ = ツリー構造
•現在はURLと同義
Core Features
JAX-RSの処理フロー
1回のリクエスト・レスポンスで処理が完結する
RESTの3要素とJAX-RS
•リソース →リソースクラス (POJO)
•メソッド →リソースクラスのメソッド + 対応するアノテーション@GET, @POST, @PUT, @DELETE
• URI →リソースクラス(とメソッド)に付加された@Pathアノテーション
リソースクラス
•リソースの振る舞いを定義するPOJO
• @Pathアノテーション付きのクラス
•リクエスト→内容を判断し適切なメソッドに振り分け
• EJB(Stateless or Singleton)で定義可→EJB連携…CDIを使用するには必須
@Path(”/hello”)
public class HelloResource {
@GET
@Consumes(”application/x-www-urlencoded”)
@Produces(”text/plain”)
public String sayHello(@QueryParam(”q”) String name) {
return “Hello, ” + name;
}
}
簡単なリソースクラスの例
@Path(”/hello”)
public class HelloResource {
@GET
@Consumes(”application/x-www-urlencoded”)
@Produces(”text/plain”)
public String sayHello(@QueryParam(”q”) String name) {
return “Hello, ” + name;
}
}
GET /hello?q=everybody
Response Request
リソースクラスのメソッド引数アノテーション 設定される値@QueryParam クエリー・パラメーターの値@FormParam フォーム・パラメーターの値@PathParam URIの一部
@MatrixParam Matrix URIの属性部分@HeaderParam リクエストヘッダーの値@CookieParam クッキーの値
(なし) リクエストボディー
@Path(”/hello/{q}”)
public class HelloResource {
@GET
@Consumes(”application/x-www-urlencoded”)
@Produces(”text/plain”)
public String sayHello(@PathParam(”q”) String name) {
return “Hello, ” + name;
}
}
GET /hello/everybody
Response Request
参考: @PathParam
@Path("/position")public class PositionResource { @GET public String getPosition( @MatrixParam("latitude") double latitude, @MatrixParam("longitude") double longitude) { return String.format("%3.2f%s %3.2f%s", Math.abs(latitude), latitude == 0.0 ? "" : (latitude > 0.0 ? "N" : "S"), Math.abs(longitude), longitude == 0.0 ? "" : (longitude > 0.0 ? "E" : "W")); }}
GET /position;latitude=35.75;longitude=139.72参考: @MatrixParam
JavaクラスとMIMEタイプの対応Javaクラス MIMEタイプ
byte[ ]任意のMIMEタイプ
(*/*)String 任意のMIMEタイプ
(*/*)InputStream任意のMIMEタイプ
(*/*)Reader
任意のMIMEタイプ(*/*)
JavaBean(JAXB)
text/xmlJavaBean
(JAXB) application/xmlJavaBean(JAXB)
application/jsonMultivaluedMap application/x-www-urlencoded
Boolean text/plain※プリミティブ型はauto-boxing
Charactertext/plain
※プリミティブ型はauto-boxingNumber
text/plain※プリミティブ型はauto-boxing
特殊なMIMEタイプ
•最も汎用的な方法:MessageBodyReaderまたはMessageBodyWriterを拡張する
• JAXBの使用が前提なら、JAXBのカスタマイズを行う方が容易
• byte[ ]やInputStreamで受けて、独自にデコードする方法もあり(結構大変)
JAX-RSのHTTPステータス
デフォルトで以下のいずれかを返す
•200 (OK)処理が正常に終了した場合
•500 (Internal Server Error)処理中に例外がスローされた場合
JAX-RSのHTTPステータス
エラー時に500以外を返したい場合(例: パラメーター不正の場合に400)
•WebApplicationException任意のステータスを設定できるランタイム例外
JAX-RSのHTTPステータス
•JAX-RSはRESTfulである→正常/異常はHTTPステータスのみ→HTTPステータスの理解が重要
•HTTPステータスは頻度にばらつき→頻出のものを確実に押さえる
How to deploy
JAX-RSのデプロイ方法
•Webアプリケーションとしてデプロイ
•設定方法:
1.Applicationのサブクラスを作成(web.xml不要、WLS 12c)
2.実装固有のサーブレットを登録(web.xml必須、WLS 11g (10.3.4-))
// WebLogic 12c@ApplicationPath(“/app”)public MyApplication extends Application { // 通常は空の実装でよい}
下記のURLでアクセス可能:http://hostname/context-root/app/hello
Applicationのサブクラスを作成
実装固有のサーブレットを登録
<!-- WebLogic 11g (10.3.4) or lator --><servlet> <servlet-name>Jersey</servlet-name> <servlet-class>com.sun.jersey.spi.container .servlet.ServletContainer</servlet-class></servlet><servlet-mapping> <servlet-name>Jersey</servlet-name> <url-pattern>/app/*</url-pattern></servlet-mapping>
OEPEで開発する際の注意点
•動的Webプロジェクトで作成(Servlet/JSPと同様)
•ビルド・パスにWebLogicの共有ライブラリー(後述)を追加
•weblogic.xmlの修正も忘れずに
共有ライブラリ(JAX-RS)名称 説明 要否
jsr311-apiJAX-RS API & 実装 必須
jersey-bundleJAX-RS API & 実装 必須
jackson-core-asl
JAXB拡張(JSON対応)
任意(推奨)
jackson-mapper-asl JAXB拡張(JSON対応)
任意(推奨)jackson-jaxrs
JAXB拡張(JSON対応)
任意(推奨)
jettison
JAXB拡張(JSON対応)
任意(推奨)
rome Atom用 任意
共有ライブラリ(JAX-RS)
Demonstrations
Programming JAX-RS
演習問題 (JAX-RSを使ってみよう)
•ネットワーク上に存在するPCの情報を管理するためのWebサービスを作成してください。
• 要求定義は下記補足資料を参照のこと:「WebLogicでJAX-RS」演習問題
解法のポイント1.リソースを明確にする• リソースは何か?• リソースのデータ構造は?
2.URIを決める• 一意になるように• 階層構造も考慮に入れる
3.メソッドを定義する• 要求に対して過不足のないように
参考資料 (Web)
JAX-RS 公式サイト
• http://jsr311.java.net (JSR 311)
• http://jersey.java.net (Jersey)
講演者ブログ (本セッションのサポート)
• http://www.coppermine.jp/docs/programming/
参考資料 (書籍)• RESTful Webサービス
Leonard Richardson, Sam Ruby 共著オライリー・ジャパン ISBN978-4873113531
• JavaによるRESTfulシステム構築Bill Burke 著オライリー・ジャパン ISBN978-4873114675
• Beginning Java EE 6Antonio Goncalves 著翔泳社 ISBN978-4798124605
JAX-RS on WebLogicMarch 21, 2013
HASUNUMA [email protected]
Top Related