将服务对象注入guice模块

时间:2016-03-26 16:54:38

标签: playframework dependency-injection guice playframework-2.4

我正在使用PlayFramework(java)和Guice for DI,以及pac4j。这是我的Guice模块基于pac4j demo app的样子。在代码中,我传递了一个CustomAuthentication,其中我注入了一个SericeDAO对象,但它总是 null

最初的想法是因为我创建CustomAuthenticator而不是让guice创建它,因此它为null。我还尝试将CustomAuthenticator直接注入安全模块 - 然后customAuthenticator对象为null。不知道我做错了什么。

public class SecurityModule extends AbstractModule {

    private final Environment environment;
    private final Configuration configuration;

    public SecurityModule(
            Environment environment,
            Configuration configuration) {
        this.environment = environment;
        this.configuration = configuration;
    }

    @Override
    protected void configure() {
        final String baseUrl = configuration.getString("baseUrl");

        // HTTP
        final FormClient formClient = new FormClient(baseUrl + "/loginForm", new CustomAuthenticator());

        final Clients clients = new Clients(baseUrl + "/callback", formClient);

        final Config config = new Config(clients);
        bind(Config.class).toInstance(config);

    }
}

CustomAuthenticator impl:

public class CustomAuthenticator implements UsernamePasswordAuthenticator {

    @Inject
    private ServiceDAO dao;

    @Override
    public void validate(UsernamePasswordCredentials credentials) {
        Logger.info("got to custom validation");
        if(dao == null) {
            Logger.info("dao is null, fml"); // Why is this always null? :(
        }
    }
}

ServiceDAO已经设置为guice模块

public class ServiceDAOModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(ServiceDAO.class).asEagerSingleton();
    }

}

1 个答案:

答案 0 :(得分:1)

您的代码中有两个错误。

首先,使用 new 构建的任何内容都不会注入@Inject工作。 其次,你不能将东西注入模块。

要解决此问题,请像这样重构代码。

  1. 确保在另一个模块之前加载ServiceDaoModule。
  2. 重构安全模块,如下所示:
    1. 删除所有构造函数参数/构造函数
    2. 将CustomAuthenticator绑定为急切的单身人士
    3. 创建并绑定提供者。在那里你可以@Inject配置。
    4. 创建并绑定Provider,这个可以@Inject配置和FormClient
    5. 创建并绑定@Inject客户端的Provider。