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プロジェクト]で利用可能です。