Как залить бобы Hk2 с помощью Guice - PullRequest
0 голосов
/ 09 апреля 2020

Существует приложение 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());
 }

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

После копания Guice и HK2ToGuiceTypeListenerImpl я выяснил, что есть bindListener для того, чтобы перехватывать недостающие привязки и извлекать их откуда-то. Код @HKInject есть, но я заметил, что слушатель не вызывается для какого-либо bean-компонента, включая интересующий меня bean-компонент. Да, HKInject не поддерживает внедрение в конструктор (версия 4.2.1)

Поэтому я решил вручную импортировать HK-бобы и связать их в Guice. Терминология Dropwizard ужасна, есть методы получить контекст чего-то, получить контекст администратора совершенно иначе, и bean-компоненты должны быть получены с помощью метода getService!

@RequiredArgsConstructor
public class HkModule extends AbstractModule {
    private final ServiceLocator locator;

    @Override
    protected void configure() {
        binder().requireExplicitBindings();

        Provider<Bar> barProvider = locator.getService(
                new TypeLiteral<Provider<Bar>>(){}.getType());
        bind(Bar.class).toProvider(barProvider);
        bind(Foo.class).toInstance(locator.getService(Foo.class));
    }
}

0 голосов
/ 09 апреля 2020

К сожалению, в бинах Guice вы должны использовать @ HK2Inject, а не @Inject, чтобы вводить бины hk2 в Guice. Таким образом, в вашем коде выше вы должны сделать:

public class DependsOnHk2Bean { @HK2Inject public DependsOnHk2Bean(MyHk2Bean b) {} }

Это из-за ограничений в подсказках (это может быть исправлено к настоящему времени), так что поведение @Inject не может быть перезаписано

У меня нет Я сам попробовал приведенный выше код, так что я не уверен, что он сработает, но это была сделка назад, когда был написан мост ...

См. HK2Inject и injecting- ¯hk2-услуги-в-Guice-услуги

...