Как создать и использовать и использовать экземпляр guice в java play - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь использовать guice и хочу создать синглтонский случайный клиент веб-сервиса в Java Play 2.6

На данный момент у меня есть клиент WS, и он загружается как модуль воспроизведения Java.Когда я запускаю приложение, нет проблем, мой клиент может использовать конфигурацию java play (com.typesafe.config.Config), которая вводится.Но если я пытаюсь использовать мой клиент где-либо еще, я получаю сообщение об ошибке: No implementation for com.typesafe.config.Config was bound.

Вот мой (очень простой) клиент:

import play.Logger;
import com.typesafe.config.Config;

@Singleton
public class MyClient {
    final Config config;

    @Inject
    public MyClient(Config config) {
        this.config = config;
        Logger.warn("constructor called")
        Logger.warn("Some config param:"+config.getString("some_param"))
    }

    public void doSomething() {
        Logger.warn("doSomething() called")
    }

}

Мой модуль, реализующий абстрактный модуль Guice:

import com.google.inject.AbstractModule;

public class MyClientModule extends AbstractModule {
    @Override 
    protected void configure() {
        bind(MyClient.class).asEagerSingleton();
    }

}

Когда я приказываю Play использовать его в качестве модуля в applicationf.conf, он работает (я получаю журналы предупреждений "Constructor called" и "Some config param" в консоли):

play {
  modules {
    enabled += external.MyClientModule
  }
}

Но если я попытаюсь позвонить с моего HomeController:

public class HomeController extends Controller {
    public Result index() {
        Injector myClientInjector = Guice.createInjector(new MyClientModule());
        MyClient myClient = myClientInjector.getInstance(MyClient.class);
        return ok(views.html.index.render());
    }
}

, я получу следующую ошибку:

[CreationException: Unable to create injector, see the following errors:

1) No implementation for com.typesafe.config.Config was bound.
  while locating com.typesafe.config.Config
    for the 1st parameter of external.MyClient.<init>(MyClient.java:121)
  at external.MyClientModule.configure(MyClientModule.java:8)

1 error]

Я почти уверен, что естьНесколько вещей здесь не так, каков будет правильный способ связать это и затем использовать это?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

В HomeController используйте инъекцию конструктора:

@Inject
public HomeController (final MyClient myclient) {
    this.myclient = myclient;
}

Вы можете аннотировать 1 конструктор, как этот, поэтому он должен содержать все классы, которые вы хотите внедрить.Вы можете комбинировать конструктор и инжекцию поля, но это не рекомендуется.

0 голосов
/ 31 мая 2018

Привязка asEagerSingleton () означает, что она привязана максимально быстро.В этом случае Config еще не связан, поэтому он не работает.

Используйте

bind(MyClient.class).in(Singleton.class)

, который связывает его как одиночный, когда это необходимо.

В HomeController, используйте инъекцию конструктора:

@Inject
public HomeController (final MyClient myclient) {
    this.myclient = myclient;
}

Вы можете аннотировать 1 конструктор, как этот, поэтому он должен содержать все классы, которые вы хотите внедрить.Вы можете комбинировать конструктор и инжекцию поля, но это не рекомендуется.

...