JAX-RSとは何か?

2019年7月20日

RESTとは?

JAX-RS以前にRESTなのだが、これは何らかのAPIをウェブサービスとして実現するものだ。参考URLから例を拾ってみると、従業員を操作する場合に以下のようなhttpリクエストを送る。

検索 GET /employees?name={name}
取得 GET /employees/{ID}
登録 POST /employees
更新 PUT /employees/{ID}
削除 DELETE /employees/{ID}

ただし、REST自体は応答のデータ形式を規定しているわけではなく、応答はJSONでもXMLでも良いらしい。もちろん、登録の場合には、大きなデータを送り込む必要があるわけだが、これもJSONでもXMLでも良い。

JAX-RSとは?

上記の処理を、Javaサーブレットとして処理したいわけだが、これを簡単にするための仕組みがJAX-RSであるらしい。ただし、JAX-RS自体は「仕様」であり、実際の処理はしてくれない。もちろん、Javaオブジェクト/JSON・XML変換のの仕組みも無い。

JAX-RS自体は、単純に以下のようにJavaクラスにつけるアノテーションを定義している模様だ。

@Path("employees")
public class EmployeeResource {
  @GET
  @Produces(....)
  public List<Employee> search(@QueryParam("name") String name) {
    ....
  }
}

JAX-RSを利用するには、例えば以下の依存をgradleに入れる。

  // JAX-RSアノテーション。@GET, @POST, @Path, @PathParam, @QueryParam, など
  compile group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '2.1.1'

Jerseyとは?

JAX-RS自体は単なる仕様であり、実装はまた別途作成する必要があるのだが、その実装の中でも「リファレンス実装」となっているのがJerseyというものだ。

※例えば、サーブレットという仕様があり、Tomcat、Glassfish、Jettyという実装があるのだが、特にTomcatがリファレンス実装となっていることと同様。

さて、jerseyにはいくつものjarライブラリがあるだが、具体的にそれらのjarの意味については探し出せなかった。何らかのサンプルを見てみると、以下が必要のようだ。

  // RESTリソースに対するREST/JSONクエリを処理する。
  compile group: 'org.glassfish.jersey.containers', name: 'jersey-container-servlet', version: '2.29'

  // 2.29では不要かもしれない。
  // 「java.lang.IllegalStateException: InjectionManagerFactory not found」エラーへの対処。以下を参照
  // https://stackoverflow.com/a/44546979/1123654
  compile group: 'org.glassfish.jersey.inject', name: 'jersey-hk2', version: '2.29'

Jacksonとは?

これは単純に、Javaオブジェクト・JSON間の変換を行うライブラリでJAX-RSとは無関係だ。

最初に書いたように、JAX-RSではそのデータ形式を規定しておらず、JSON、XML、はたまた他の形式で良いことになっているのだが、ほとんどがJSONを利用しているものと思われる。

そのため、JAX-RSのリファレンス実装であるJerseyもまた、Jacksonを利用してJSON変換をするケースが多いようだ。

おそらくだが、jerseyでjacksonを使用するには、次のライブラリを追加する。

  // JerseyにJacksonを使わせる
  compile group: 'org.glassfish.jersey.media', name: 'jersey-media-json-jackson', version: '2.29'

  // JAX-RSアノテーションに基づくシリアライゼーション・でシリアライゼーションのため。
  // RestyGWTによってクライアント側で使用される。
  // また @JsonInclude、@JsonIgnoreといったアノテーションも追加している。
  compile group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version: '2.9.9'  

参考