Tomcat で Jersey を使ってみた

ちょっと Jersey を使ってみたので、メモしておきます。

今回はサーブレットコンテナは Tomcat ( 7.0.59 ) にして、ライブラリのダウンロードは Maven 使いました。

1. pom.xml に Jersey 使う設定を追記


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>jersey-app</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
<dependencies>  
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.17</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.17</version>
</dependency>
</dependencies>
</project>

JAX-RS の実装含まないサーバってことで、以下を参考に。

・Chapter 2. Modules and dependencies
- 2.3.2. Servlet based server-side application
https://jersey.java.net/documentation/latest/modules-and-dependencies.html#servlet-app-general


2. リソースクラスの作成


■ HelloService.java

package com.example;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/hello")
public class HelloResource {
	@GET
	@Produces("text/plain")
	public String hello() {
		return "hello resource !!";
	}
}

"/hello" というパスでアクセスきたら、"hello resource !!" という文字列を返すだけの簡単なリソースクラスです。

以下あたりが参考に。

・Chapter 3. JAX-RS Application, Resources and Sub-Resources
https://jersey.java.net/documentation/latest/jaxrs-resources.html


3. web.xml の編集


<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">

 <servlet>
  <servlet-name>jersey-app</servlet-name>
  <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  <init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>com.example</param-value>
  </init-param>
  <init-param>
    <param-name>jersey.config.server.provider.scanning.recursive</param-name>
    <param-value>false</param-value>
  </init-param>
 </servlet>

 <servlet-mapping>
  <servlet-name>jersey-app</servlet-name>
  <url-pattern>/test/*</url-pattern>
 </servlet-mapping>
 
</web-app>

"/test/*" なパスでアクセスきたら、Jersey のサーブレットが呼ばれるって感じにしています。

以下あたりを参考に。

・Chapter 4. Application Deployment and Runtime Environments
- 4.7. Servlet-based Deployment
https://jersey.java.net/documentation/latest/deployment.html#deployment.servlet

Servlet 3.x をサポートしているコンテナであれば、@ApplicationPath アノテーションを使う方法もあるみたいです。

・Chapter 4. Application Deployment and Runtime Environments
- 4.7.2. Servlet 3.x Container
https://jersey.java.net/documentation/latest/deployment.html#deployment.servlet.3


あとは、Tomcat にデプロイして「http://localhost:8080/test/hello」にアクセスすると、"hello resource !!" と表示されるはずです。

クライアントの API も用意されているので、それ使ってもいいですね。

package com.example.client;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

public class HelloClient {
	public static void main(String[] args) {
		Client client = ClientBuilder.newClient();
		WebTarget target = client.target("http://localhost:8080/jersey-app/test/hello");
		Invocation.Builder builder = target.request(MediaType.TEXT_PLAIN_TYPE);
		Response response = builder.get();
		System.out.println(response.getStatus());
		System.out.println(response.readEntity(String.class));
	}
}

・Chapter 5. Client API
https://jersey.java.net/documentation/latest/client.html


簡単ですが、ひとまず使い方だけということで、以上です。