我正在使用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();
}
}
答案 0 :(得分:1)
您的代码中有两个错误。
首先,使用 new 构建的任何内容都不会注入@Inject工作。 其次,你不能将东西注入模块。
要解决此问题,请像这样重构代码。