JAX-RS 2.0からDI(JSR-330)が仕様に組み込まれています。JAX-RSの参照実装であるJerseyにも2.XからはDIが組み込まれています。ところが、そのJSR-330の実装はHK2でした。そのため同じくJSR-330の実装であるGuiceとJerseyの連携が、Jersey1.Xのころと同じ方法ではできなくなりました。どうする!?
HK2がBridgeを提供してくれました!
HK2がGuiceとのBridgeを提供してくれたので、ちょこっと書いたら動くようです。
package web;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.ServletModule;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.jersey.server.ResourceConfig;
import org.jvnet.hk2.guice.bridge.api.GuiceBridge;
import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.ws.rs.ApplicationPath;
@ApplicationPath("/")
public class MyApplication extends ResourceConfig {
private static Logger logger = LoggerFactory.getLogger(MyApplication.class);
@Inject
public MyApplication(ServiceLocator serviceLocator) {
logger.info("start.")
// GuiceBridgeの初期化
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
// ServletModuleをGuiceBridgeに登録する
guiceBridge.bridgeGuiceInjector(Guice.createInjector(new ServletModule() {
@Override
protected void configureServlets() {
bind(YourInjectableOne.class);
}
}));
packages("your.resource");
logger.info("end.")
}
}
依存性はこんな感じ。
build.gradle
dependencies {
compile 'org.glassfish.hk2:guice-bridge:2.3.0-b05'
compile 'com.google.guava:guava:17.0'
compile 'com.google.inject:guice:3.0'
compile 'com.google.inject.extensions:guice-persist:3.0'
compile 'com.google.inject.extensions:guice-servlet:3.0'
compile 'org.glassfish.jersey.core:jersey-server:2.8'
compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.8'
}
参考