ServletとJAX-RSの比較
冗長なHttpServletボイラープレートを宣言的なJAX-RSリソースクラスに置き換える。
コード比較
✕ Java EE
@WebServlet("/users")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
String id = req.getParameter("id");
res.setContentType("application/json");
res.getWriter().write("{\"id\":\"" + id + "\"}");
}
}
✓ Jakarta EE 8+
@Path("/users")
public class UserResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getUser(
@QueryParam("id") String id) {
return Response.ok(new User(id)).build();
}
}
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
宣言的ルーティング
HTTPメソッド・パス・コンテンツタイプをアノテーションで定義し、命令型のif/elseディスパッチは不要です。
自動マーシャリング
POJOを直接返すだけで、@Producesに基づいてJSONやXMLにシリアライズされます。
テスト容易
リソースクラスはプレーンなJavaオブジェクトで、サーブレットコンテナなしでテストできます。
旧来のアプローチ
HttpServlet
モダンなアプローチ
JAX-RSリソース
JDKバージョン
11
難易度
中級
JDKサポート
ServletとJAX-RSの比較
利用可能
Jakarta EE 8 / Java 11以降、広く利用可能
仕組み
JAX-RS(Jakarta RESTful Web Services)では@GET・@Path・@Producesなどのシンプルなアノテーションを使ってRESTエンドポイントを公開できます。リクエストパラメーターの手動解析やレスポンスのコンテンツタイプ設定は不要で、ランタイムがマーシャリングとルーティングを自動的に処理します。
関連ドキュメント