Существует приложение dropwizard, основанное на джерси. Я переписал определения bean-компонентов Hk2 в Guice, и теперь я могу добавить bean-компоненты Guice в ресурсы Jersey, но заметил, что bean-компоненты Hk2, определенные в комплектах dropwizard, которые я не могу переписать, не видны Guice, и он не может внедрить зависимости, определенные в Hk2.
Guice не видит bean-компоненты, определенные в пакетах Hk2, и Guice по умолчанию создает новые неинициализированные bean-компоненты. Я отключил это поведение с помощью requireExplicitBindings.
Я экспериментировал с HK2IntoGuiceBridge, но его сопоставление не вызывается для интересующих его bean-компонентов. ConfiguredBundleX находится во внешнем артефакте.
Я пытался копировать и переводить определения бинов из связок и застрял с бобом Джерси Provider<ContainerRequest>
, я понятия не имею, откуда это.
public class ConfiguredBundleX implements ConfiguredBundle<MyAppConf> {
public void run(T configuration, Environment environment) throws Exception {
environment.jersey().register(new AbstractBinder() {
protected void configure() {
this.bind(new MyHk2Bean()).to(MyHk2Bean.class);
}
});
}
}
public class DependsOnHk2Bean { @Inject public DependsOnHk2Bean(MyHk2Bean b) {} }
public class MainModule extends AbstractModule {
private final ServiceLocator locator;
protected void configure() {
binder().requireExplicitBindings();
install(new HK2IntoGuiceBridge(locator));
bind(DependsOnHk2Bean.class);
}
public class GuiceFeature implements Feature {
public boolean configure(FeatureContext context) {
ServiceLocator locator = ServiceLocatorProvider.getServiceLocator(context);
GuiceBridge.getGuiceBridge().initializeGuiceBridge(locator);
Injector injector = Guice.createInjector(
new HK2IntoGuiceBridge(locator),
new MainModule(locator));
GuiceIntoHK2Bridge guiceBridge = locator.getService(GuiceIntoHK2Bridge.class);
guiceBridge.bridgeGuiceInjector(injector);
return true;
}
}
// ...
public void initialize(Bootstrap<X> bootstrap) {
bootstrap.addBundle(new ConfiguredBundleX());
}
public void run(X config, Environment env) {
env.jersey().register(new GuiceFeature());
}