JAX-RSをやってみる (5) - CDI -
んまぁ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"));
}
}