S-JIS[2024-03-10] 変更履歴
JAX-RSのリソースクラスのメモ。
JAX-RSでは、REST APIの処理を行うクラスをリソースと呼ぶらしい。
import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType;
@Path("/resource1") public class Resource1 { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "hello"; } }
リソースクラスのクラス名は何でもいい。
ApplicationのgetClassesメソッドで使用するリソースクラスを指定する。
Pathアノテーションで、REST APIのURI(の末尾)を指定する。
REST APIのURIは、コンテキストルート・ApplicationPath・Pathで決まる。
コンテキストルートはAPサーバーが決める。デフォルトでは、大抵はデプロイしたwarファイルのファイル名になるようだ。(コンテキストルートの変更方法はAPサーバーによって異なる)
例えばコンテキストルートがexample、ApplicationPathが/api、Pathが/resource1の場合、REST
APIのURIは「http://localhost:8080/example/api/resource1
」のようになる。
REST APIの処理を行うメソッドも、メソッド名は何でもいい。
メソッドにもPathアノテーションを付けることが出来る。その場合、URI(の末尾)は「クラスに付けたPath/メソッドに付けたPath」になる。
HTTPのGETメソッドを受け取る場合はGETアノテーション、POSTメソッドを受け付ける場合はPOSTアノテーションを付ける。
メソッドの引数でHTTPリクエストのbodyを受け取る場合はConsumesアノテーションを付ける。
HTTPレスポンスのbodyの種類をProducesアノテーションで指定する。
単なる文字列を返す場合はTEXT_PLAINを指定し、メソッドの戻り値の型をStringにする。
@ProducesにAPPLICATION_JSONを指定して、処理するメソッドの戻り値の型にJavaBeansを指定すると、自動的にJSONに変換される。
public class MyResultBean { private String name; private List<String> valueList; 〜setter/getter〜 }
@Path("/return-json") @GET @Produces(MediaType.APPLICATION_JSON) public MyResultBean returnJson() { var result = new MyResultBean(); result.setName("hello"); result.setValueList(List.of("value1", "value2")); return result; }
リクエストとしてJSONを受け取る場合は@POSTを使い、@ConsumesでAPPLICATION_JSONを指定する。
そして、メソッドの引数に「JSONから変換されるJavaBeans」を指定する。
public class MyRequestBean { private String name; private String value; 〜setter/getter〜 }
import jakarta.ws.rs.Consumes; import jakarta.ws.rs.POST; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType;
@Path("/json-parameter") @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String jsonParameter(MyRequestBean parameter) { return 〜; }
JSONを受け取る例とJSONを返す例を融合するだけ。
import jakarta.ws.rs.Consumes; import jakarta.ws.rs.POST; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType;
@Path("/hello-json") @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public MyResultBean helloJson(MyRequestBean parameter) { var result = new MyResultBean(); 〜 return result; }