Jakarta EE 10 の学習 - Jakarta RESTful ウェブサービス -

記事
IT・テクノロジー
Jakarta EE で RESTful ウェブサービスを開発する方法について学習する。仕様書としては "Jakarta RESTful Web Services 3.1" が対応する。

Jakarta REST サンプルアプリ hello のビルド

この記事では The Jakarta EE Tutorial (eclipse-ee4j.github.io/jakartaee-tutorial/) のサイトで使われている Jakarta RESTのサンプルアプリケーションのひとつである hello をビルドして実行してみる。

これまでと同様に、サンプルアプリが含まれるプロジェクトは、下記のGitHub リポジトリから git clone で取得している。
github.com/eclipse-ee4j/jakartaee

NetBeans IDE で hello プロジェクトを開く。 (tutorial/jarxs/hello ディレクトリを選択)
openproject.png

Javaソースファイルとしては下記の2つのファイルが含まれている。
HelloApplication.java
HelloWorld.java
hello_project.png

プロジェクトをビルドするとサーバーにデプロイされる。
app.png

Launch をクリックしてアプリを起動させる。

hello アプリの動作

curl コマンドでGET リクエストを送信するとレスポンスが text/html で返ってくる。
$ curl -i localhost:8080/hello/helloworld

(レスポンスヘッダ)
HTTP/1.1 200 OK
Server: Eclipse GlassFish 7.0.6
X-Powered-By: Servlet/6.0 JSP/3.1(Eclipse GlassFish 7.0.6 Java/Eclipse Adoptium/17)
Content-Type: text/html
Content-Length: 59

(レスポンスボディ)
<html lang="en"><body><h1>Hello, World!!</h1></body></html>

PUT メソッドでデータを送信
$ curl -iX PUT -H "Content-Type: text/html" localhost:8080/hello/helloworld -d "<html><body></body></html>"

(レスポンスヘッダ)
HTTP/1.1 204 No Content
Server: Eclipse GlassFish 7.0.6
X-Powered-By: Servlet/6.0 JSP/3.1(Eclipse GlassFish 7.0.6 Java/Eclipse Adoptium/17)

この場合のHTTPレスポンスはヘッダのみとなる。 PUTリクエストに対する処理内容は何も定義されていないので、レスポンスが返される以外は何も起こらない。

hello アプリのソースコード

Java ソースコードの内容を確認する。

HelloAplication.java では HelloAplication クラスを定義
HelloApplication_class.png

Jakarta RESTful ウェブサービスのアプリケーションはウェブアプリケーションとして WARファイルにパッケージされる。
このRESTfulウェブサービスのアプリケーションにはサーブレットを加える必要があり、仕様書では具体的な構成方法として複数のパターンが記載されている。
ここではその内のひとつの方法として、 jakarta.ws.rs.core.Application のサブクラスを定義することで、自動的に同名のサーブレットを動的に加える方法が使われている。

ApplicationPath アノテーションはこのサーブレットのマッピングパスを設定するのに使用されている。

HelloWorld.java では HelloWorld クラスを定義
HelloWorld_class.png

RESTful ウェブサービスのアプリケーションではウェブリソースがリソースクラスとして実装される。
リソースメソッドがそれぞれのリクエストを処理する。リソースメソッドの指定にはHTTP メソッドに対応した GET, POST, PUT その他のアノテーションを使用する。
リソースメソッドは public である必要がある。

Path アノテーション
Path アノテーションはクラス定義に付加すると、ルートリソースクラスを指定する。パラメータの "helloworld" はこのリソースのベースURIからの相対URI を指定している。

ルートリソースクラスはリソースの配置をツリーとみなしたときのルートとなる。
ルートリソースクラスは実行時に自動的にインスタンスが生成される。

Produces アノテーション
Produces アノテーションはリソースメソッドの返すレスポンスのメディアタイプを指定している。

Consumes
Consumes アノテーションはリソースメソッドがサポートするリクエストのメディアタイプを指定している。

Context アノテーション
ここでは UriInfo のインスタンスをインジェクトするために使用されている。このインスタンスを参照する変数である context はこのアプリケーションでは特に使われていない。
UriInfo はリクエストURI の情報をプログラム中で取得するために使用することができる。(例えばリクエストのクエリパラメータの名前など)

参考資料:
"Jakarta RESTful Web Services 3.1" の仕様書

コメント: HelloApplication クラスの中身について後で少し追記するかも。
コメント: 記事内の情報は著者が個人的に調べた範囲で理解しているものです。必要に応じて訂正する場合があります。記事中に含まれるURL はプロトコルを含めると禁止ワードに引っ掛かるので省いています。

著者・投稿者: ENARTS05
編集履歴:
2023/12/5 作成

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す