JerseyとSpringでのREST API

1概要

Jersey は、RESTful Webサービスを開発するためのオープンソースフレームワークです。 JAX-RSの参照実装として機能します。

この記事では、Jersey 2を使用したRESTful Webサービスの作成について説明します。また、SpringのDI(Dependency Injection)をJava構成で使用します。

2 Mavenの依存関係

pom.xml に依存関係を追加することから始めましょう。

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.26</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.26</version>
</dependency>

また、Springとの統合には jersey-spring4 依存関係を追加する必要があります。

<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-spring4</artifactId>
    <version>2.26</version>
</dependency>

これらの依存関係の最新版はhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.glassfish.jersey.containers%22%20AND%20a%3A%22jersey-で入手できます。 container-servlet%22[jersey-container-servlet]、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.glassfish.jersey.media%22%20AND%20a% 3A%22jersey-media-json-jackson%22[jersey-media-json-jackson]およびhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22jersey-spring4%22[ジャージースプリング4]。

3 Web設定

  • 次に、サーブレットの設定を行うためのWebプロジェクトを設定する必要があります。

@Order(Ordered.HIGHEST__PRECEDENCE)
public class ApplicationInitializer
  implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext)
      throws ServletException {

        AnnotationConfigWebApplicationContext context
          = new AnnotationConfigWebApplicationContext();

        servletContext.addListener(new ContextLoaderListener(context));
        servletContext.setInitParameter(
          "contextConfigLocation", "com.baeldung.server");
    }
}

ここでは、初期化子がJersey-Springのデフォルト初期化子の前に実行されるように、 @ Order(Ordered.HIGHEST PRECEDENCE)__注釈を追加しています。

4 Jersey JAX-RS を使用したサービス

4.1. リソース表現クラス

サンプルのリソース表現クラスを使用しましょう。

@XmlRootElement
public class Employee {
    private int id;
    private String firstName;

   //standard getters and setters
}

@ XmlRootElement のようなJAXBアノテーションは、XMLサポートが(JSONに加えて)必要な場合にのみ必要であることに注意してください。

4.2. サービス実施

では、JAX-RSアノテーションを使ってRESTful Webサービスを作成する方法を見てみましょう。

@Path("/employees")
public class EmployeeResource {

    @Autowired
    private EmployeeRepository employeeRepository;

    @GET
    @Path("/{id}")
    @Produces({ MediaType.APPLICATION__JSON, MediaType.APPLICATION__XML })
    public Employee getEmployee(@PathParam("id") int id) {
        return employeeRepository.getEmployee(id);
    }

    @POST
    @Consumes({ MediaType.APPLICATION__JSON, MediaType.APPLICATION__XML })
    public Response addEmployee(
      Employee employee, @Context UriInfo uriInfo) {

        employeeRepository.addEmployee(new Employee(employee.getId(),
          employee.getFirstName(), employee.getLastName(),
          employee.getAge()));

        return Response.status(Response.Status.CREATED.getStatusCode())
          .header(
            "Location",
            String.format("%s/%s",uriInfo.getAbsolutePath().toString(),
            employee.getId())).build();
    }
}
  • @ Path アノテーションは、サービスへの相対URIパスを提供します** \ {id} 変数が示すように、URI構文内に変数を埋め込むこともできます。その後、変数は実行時に置き換えられます。取得するには、変数の値を @ PathParam アノテーションを使用します。

  • @ Produces アノテーションはエンドポイントのレスポンスタイプ** (MIMEメディアタイプ)を定義します。この例では、HTTPヘッダー Accept application/json または application/xml )の値に応じてJSONまたはXMLのいずれかを返すように設定しました。

  • 一方、 Consumes アノテーションは、サービスが使用できるMIMEメディアタイプを定義します。** この例では、サービスはHTTPヘッダー Content-Type application/json または application/xml )に応じてJSONまたはXMLを使用できます。 )

@ Context アノテーションは、クラスフィールド、Beanプロパティ、またはメソッドパラメータに情報を注入するために使用されます。この例では、これを使って UriInfo を注入しています。 ServletConfig ServletContext HttpServletRequest 、および__HttpServletResponseをインジェクトするためにも使用できます。

5 ExceptionMapper を使用する

ExceptionMapper を使用すると、例外をインターセプトして適切なHTTP応答コードをクライアントに返すことができます。次の例では、 EmployeeNotFound exceptionがスローされた場合にHTTPレスポンスコード404が返されます。

@Provider
public class NotFoundExceptionHandler
  implements ExceptionMapper<EmployeeNotFound> {

    public Response toResponse(EmployeeNotFound ex) {
        return Response.status(Response.Status.NOT__FOUND).build();
    }
}

6. リソースクラスの管理

最後に、すべてのサービス実装クラスと例外マッパーをアプリケーションパスと結び付けます。

@ApplicationPath("/resources")
public class RestConfig extends Application {
    public Set<Class<?>> getClasses() {
        return new HashSet<Class<?>>(
          Arrays.asList(
            EmployeeResource.class,
            NotFoundExceptionHandler.class,
            AlreadyExistsExceptionHandler.class));
    }
}

7. APIテスト

実際のテストでAPIをテストしましょう。

public class JerseyApiLiveTest {

    private static final String SERVICE__URL
      = "http://localhost:8082/spring-jersey/resources/employees";

    @Test
    public void givenGetAllEmployees__whenCorrectRequest__thenResponseCodeSuccess()
      throws ClientProtocolException, IOException {

        HttpUriRequest request = new HttpGet(SERVICE__URL);

        HttpResponse httpResponse = HttpClientBuilder
          .create()
          .build()
          .execute(request);

        assertEquals(httpResponse
          .getStatusLine()
          .getStatusCode(), HttpStatus.SC__OK);
    }
}

8結論

この記事では、Jerseyフレームワークを紹介し、簡単なAPIを開発しました。 Spring for Dependency Injection機能を使用しました。 ExceptionMapper の使用も確認しました。

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-jersey[このGithubプロジェクト]で利用可能です。

前の投稿:Spring Boot CLIの紹介
次の投稿:The Baeldung Weekly Review 14