JAX-RSをやってみる (5) - CDI -

2014-06-12T00:00:00+00:00 Java JAX-RS

んまぁJAX-RSの機能っていうわけでもないと思うのですが、Java EEな@Injectを使ってDependency Injectionするっていうだけな事

設定

何やらWEB-INF/beans.xmlを作っておかないとエラーになる(多分テスト側ではエラーにならないけど、APサーバーとかにデプロイするとエラーになる的な感じかと)

<?xml version="1.0" ?>
<beans
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
    version="1.1"
    bean-discovery-mode="all">
</beans>

ってな感じで作っておく

Home.java

package sample.controller;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;

import sample.bean.SampleBean;
import sample.service.HogeService;

@Path("/sample")
public class Home {

    @Inject
    private HogeService service;

    @GET
    @Path("index")
    public String index() {
        SampleBean bean = service.get();
        return "hello: " + bean.getName();
    }
}

な感じで適当に作ったクラスを@Injectで依存性注入する的な感じで。あとはコンテナ側(CDI的にはコンテキストっていうべきなのかと)で処理されて注入されるはずなので(ry

HomeTest.java

アプリケーションサーバーとかで動かす分には依存性の注入は自動で判断して行ってくれるみたいだけど、JerseyTestを使ったテストではこの依存性注入が自動で行われない模様。っていうかその依存性の注入の解決をしない限りは@Injectを入れてるだけでエラーになる模様。なのでそこら辺を指定すれば良いっぽい

package sample.controller;

import javax.ws.rs.core.Application;

import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;

import sample.service.HogeService;

import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

public class HomeTest extends JerseyTest {

    @Override
    protected Application configure() {
        return new ResourceConfig() {
            {
                register(Home.class);
                register(new AbstractBinder() {
                    @Override
                    protected void configure() {
                        // toで指定されている型なところにbindで指定しているクラスのインスタンスなりを注入するっていうルールを定義?
                        bind(HogeService.class).to(HogeService.class);
                    }
                });
            }
        };
    }

    @Test
    public void test_index() {
        String response = target("/sample/index")
            .request()
            .get(String.class);
        assertThat(response, notNullValue());
        assertThat(response, is("hello: hoge"));
    }
}

JAX-RSをやってみる (6) - 例外処理 - JAX-RSをやってみる (4) - MessageBodyReader -