Как внедрить экземпляр моего класса в другой класс? - PullRequest
0 голосов
/ 06 марта 2020

Я использую play framework 2.8.x, и мне нужно внедрить мой класс конфигурации в другой класс, и я написал свой пользовательский модуль для создания конфигурации. Мой модуль выглядит следующим образом:

public class ConfigModule extends AbstractModule {
    private Config config;

    public ConfigModule(Environment environment, Config config) {
        this.config = config;
    }

    @Override
    protected void configure() {
        bindRedisConfig();
    }

    void bindRedisConfig() {
        System.out.println("LOAD");
        RedisConfig redisConfig = new RedisConfig(
                config.getString("configuration.redis.host")
                , config.getInt("configuration.redis.port")
                , config.getString("configuration.redis.password")
                , config.getString("configuration.redis.domain")
        );
        bind(RedisConfig.class).annotatedWith(Names.named(Constant.CONFIG_REDIS)).toInstance(redisConfig);
    }
}

, и я пытаюсь внедрить его следующим образом:

public class ProcessDataStore {
    private final JedisPool jedisPool;
    private final RedisConfig config;

    @Inject
    public ProcessDataStore(RedisConfig config) {
        this.config = config;
    }
}

мой класс конфигурации очень прост:

@Singleton
public class RedisConfig {
    public final String host;
    public final int port;
    public final String password;
    public final String domain;

    public RedisConfig(String host, int port, String password, String domain) {
        this.host = host;
        this.port = port;
        this.password = password;
        this.domain = domain;
    }
}

но когда я запускаю свое приложение, я получаю исключение:

1) Could not find a suitable constructor in config.RedisConfig. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
  at config.RedisConfig.class(RedisConfig.java:17)
  while locating config.RedisConfig
    for the 1st parameter of repository.ProcessDataStore.<init>(ProcessDataStore.java:25)
  while locating repository.ProcessDataStore
    for field at controllers.DashboardController.db(DashboardController.java:19)
  while locating controllers.DashboardController
    for the 5th parameter of router.Routes.<init>(Routes.scala:38)
  at play.api.inject.RoutesProvider$.bindingsFromConfiguration(BuiltinModule.scala:137):
Binding(class router.Routes to self) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$4)

, если я создаю конструктор по умолчанию без параметров, мое приложение не выдает никаких исключений, а вставляет RedisConfig пусто. Я загружаю свой модуль в свое приложение:

play.modules.enabled += "modules.ConfigModule"

что я могу сделать не так?

1 Ответ

1 голос
/ 09 марта 2020

Я вижу 2 подозрительных вещи.

1) @Singleton аннотация к классу RedisConfig. Он может заставить инжектор создавать и внедрять новый экземпляр класса RedisConfig вместо redisConfig.

2) Определение привязки содержит .annotatedWith(Names.named(Constant.CONFIG_REDIS)). Поэтому параметр конструктора ProcessDataStore должен быть аннотирован @Named:

 @Inject
 public ProcessDataStore( @Named(Constant.CONFIG_REDIS) RedisConfig config) {...}
...