ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

SpringBootとJersey2を連携する

SpringBootを検証しててSpringMVCがあまりイケてない感じがしてます。
アノテーションが長かったり、引数があったりなかったり、メソッド周りがごちゃごちゃしててあまり好きではないです。
そこでRESTでシンプルに書けそうなJerseyに目をつけてSpringBootと連携する方法を調べて作ってみました。


SpringBoot公式ではJersey対応のものは出ていません。
ネット上にいろんなやり方ででていますので、その中でもシンプルなものを選定しました。
ビルドはGradleを使っています。

環境

Eclipse 4.3
Java 7.0
SpringBoot 1.1.5
Jersey 2.11

ディレクトリ構成

SpringBoot標準の構成を使用します。

  • src/main/java
    • demo
      • Application.java
      • JerseyConfiguration.java
    • demo.web
      • IndexResource.java
  • build.gradle

作成・編集するファイル

build.gradle

Jersey2の依存関係を追加します。
JerseyにはSpringと連携する機能があるのでそれを使います。
Spring3となっていますが問題なく使えます。

dependencies {
    // SpringBoot
    compile("org.springframework.boot:spring-boot-starter-aop")
    compile("org.springframework.boot:spring-boot-starter-web")
    // Jerseyの依存を追加
    compile("org.glassfish.jersey.ext:jersey-spring3:2.11")
}

JerseyConfiguration.java

Jerseyの設定を行うクラスを作成します。
ここではJerseyServletの定義、Jerseyで扱うクラスの登録を行います。
クラスごとに登録する場合は「register」、
パッケージ毎に登録する場合は「packages」を使います。

package demo;

import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.spring.scope.RequestContextFilter;
import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.servlet.ServletProperties;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JerseyConfiguration extends ResourceConfig {

	@Bean
	public ServletRegistrationBean jerseyServlet() {
                // パスにはJerseyでマッピングするパスを指定する
		ServletRegistrationBean registration = new ServletRegistrationBean(new ServletContainer(), "/*");
		registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyServletConfig.class.getName());
		return registration;
	}

	public static class JerseyServletConfig extends ResourceConfig {
		public JerseyServletConfig() {
			register(RequestContextFilter.class);
                        // demo.webパッケージ内のクラスをJerseyで扱えるようにする
			packages(this.getClass().getPackage() + ".web");
			register(LoggingFilter.class);
		}
	}
}

IndexResource.java

ブラウザからアクセスさせるためのクラスを作成します。

package demo.web;

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

import org.springframework.stereotype.Component;

@Component
@Path("/")
public class IndexResource {

	@GET
        // JSONで結果を返す設定
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/hello")
	public String hello() {
		return "Hello!!";
	}
}


http://localhost:8080/helloにアクセスして「Hello!!」と表示されれば正常に動作しています。
次は「SpringBoot+Thymeleaf+Jersey」について検証してみようと思います。

SpringBootを扱っている書籍