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;
}