1. 概要

このチュートリアルでは、RESTAPI開発におけるJAX-RSSpringMVCの違いを確認します。

2. JakartaRESTfulWebサービス

JAVA EE の世界の一部になるには、機能に仕様、互換性のある実装、およびTCKが必要です。 したがって、 JAX-RS は、RESTサービスを構築するための一連の仕様です。 その最もよく知られている参照実装はRESTEasyとJerseyです。

それでは、簡単なコントローラーを実装して、Jerseyに少し慣れましょう。

@Path("/hello")
public class HelloController {

    @GET
    @Path("/{name}")
    @Produces(MediaType.TEXT_PLAIN)
    public Response hello(@PathParam("name") String name) {
        return Response.ok("Hello, " + name).build();
    }

}

上記では、エンドポイントは、アノテーション @Produces が示すように、単純な「テキスト/プレーン」応答を返します。 特に、2つの@Pathアノテーションを持つnameというパラメーターを受け入れるhelloHTTPリソースを公開しています。 また、アノテーション @GET を使用して、それがGETリクエストであることを指定する必要があります。

3. SpringMVCを使用したREST

Spring MVCは、Webアプリケーションを作成するためのSpringFrameworkのモジュールです。 SpringFrameworkにREST機能を追加します。

Spring MVCを使用して、上記と同等のGETリクエストの例を作成しましょう。

@RestController
@RequestMapping("/hello")
public class HelloController {

    @GetMapping(value = "/{name}", produces = MediaType.TEXT_PLAIN_VALUE)
    public ResponseEntity<?> hello(@PathVariable String name) {
        return new ResponseEntity<>("Hello, " + name, HttpStatus.OK);
    }

}

コードを見ると、 @RequestMapping は、 helloHTTPリソースを処理していることを示しています。 特に、 @GetMapping アノテーションを使用して、GETリクエストであることを指定しています。 name というパラメーターを受け取り、「text/plain」応答を返します。

4. 違い

JAX-RSは、一連のJavaアノテーションを提供し、それらをプレーンJavaオブジェクトに適用することに依存しています。 実際、これらの注釈は、クライアント/サーバー通信の低レベルの詳細を抽象化するのに役立ちます。 実装を簡素化するために、HTTPリクエストとレスポンスを処理し、コードにバインドするためのアノテーションを提供します。 JAX-RSは単なる仕様であり、使用するには互換性のある実装が必要です

一方、 Spring MVC は、REST機能を備えた完全なフレームワークです。 JAX-RSと同様に、低レベルの詳細から抽象化するための便利な注釈も提供します。 その主な利点は、 SpringFrameworkエコシステムの一部であることです。 したがって、他のSpringモジュールと同じように依存性注入を使用できます。 さらに、 Spring AOP Spring Data REST SpringSecurityなどの他のコンポーネントと簡単に統合できます。

5. 結論

この簡単な記事では、JAX-RSとSpringMVCの主な違いについて説明しました。

いつものように、この記事のソースコードはGitHubから入手できます。