我正在将Spring / J2EE中的当前应用程序迁移到Lagom。我在Java工作。我需要从配置中读取变量(resources文件夹中的application.conf)。在实现模块中,我尝试将配置作为类变量注入,如此
@注入 私有配置配置
但是当我在构造函数中访问此配置对象时,它会给出空指针异常。
整个代码就像这样
import play.Configuration;
public class SomeServiceImpl implements SomeService {
@Inject
private Configuration config;
public SomeServiceImpl() {
//getting configuration from application.conf
// gives exception as config is null.
String key = config.getString(“key”);
}
@Override
public ServiceCall<Request, Response> send() {
//works here, does not give exception
String key = config.getString(“key”);
}
}
对不起,我应该从一开始就明白了。我已经编辑了原始问题。当我尝试从构造函数中的配置对象读取时,我得到空指针异常,但我能够在服务调用实现中使用它。我想要一些方法,我可以在启动时访问application.conf中的配置,并可能存储在某个配置类中,以后可以在任何地方访问。
答案 0 :(得分:1)
在Java中,当一个对象被实例化时,发生的第一件事(在可能发生任何其他事情之前)是调用构造函数。在那之后,像Guice(Lagom使用)这样的框架可以自由地注入东西,但是在调用构造函数之前它们不能这样做。因此,当调用构造函数时,所有@Inject
带注释的字段都将为null,没有什么可以解决的。
所以,不要使用场注入,使用构造函数注入,例如:
import play.Configuration;
public class SomeServiceImpl implements SomeService {
private final Configuration config;
@Inject
public SomeServiceImpl(Configuration config) {
this.config = config;
String key = config.getString("key");
}
@Override
public ServiceCall<Request, Response> send() {
String key = config.getString("key");
}
}
构造函数注入不仅仅推荐用于此用例,您应该在任何地方使用它,它可以避免所有这些潜在的问题。