1. 概要

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

この記事では、 Jersey2を使用したRESTfulWebサービスの作成について説明します。 また、Springの依存性注入(DI)を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>

これらの依存関係の最新バージョンは、 jersey-container-servlet jersey-media-json-jackson 、およびjersey-spring4で入手できます。

3. Web構成

次に、サーブレット構成を行うためのWebプロジェクトをセットアップする必要があります。 これには、Springを使用します WebApplicationInitializer

@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");
    }
}

ここでは、 @Order(Ordered.HIGHEST_PRECEDENCE)アノテーションを追加して、Jersey-Springのデフォルトの初期化子の前に初期化子が実行されるようにします。

4. ジャージーJAX-RSを使用したサービス

4.1. リソース表現クラス

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

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

    // standard getters and setters
}

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

4.2. サービスの実装

次に、JAX-RSアノテーションを使用してRESTfulWebサービスを作成する方法を見てみましょう。

@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アノテーションを使用できます。

@ GET、@ PUT、@ POST、@ DELETE、および@HEADは、リクエストのHTTPメソッドを定義します。これは注釈付きのメソッドによって処理されます。

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

一方、@ Consumersアノテーションは、サービスが消費できるMIMEメディアタイプを定義します。この例では、サービスはHTTPヘッダーContent-Type[に応じてJSONまたはXMLのいずれかを消費できます。 X216X]( application /jsonまたはapplication/ xml )。

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

5. ExceptionMapperを使用する

ExceptionMapper を使用すると、例外をインターセプトして、適切なHTTP応答コードをクライアントに返すことができます。 次の例では、 EmployeeNotFound 例外がスローされた場合、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を使用しました。 ExceptionMapperの使用も確認しました。

いつものように、完全なソースコードはこのGithubプロジェクトで入手できます。