我正在将 Spring/J2EE 中当前的应用程序迁移到 Lagom。我在 Java 工作。我需要从配置(资源文件夹中的 application.conf)读取变量。在实现模块中,我尝试将配置注入(inject)为类变量,如下所示
@注入(inject) 私有(private)配置配置
但是当我在构造函数中访问此配置对象时,它给出了空指针异常。
整个代码是这样的
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 中的配置,并可能存储在某个配置类中,以便以后可以在任何地方访问。
最佳答案
在Java中,当实例化一个对象时,首先发生的事情(在其他事情可能发生之前)是调用构造函数。之后,像 Guice(Lagom 使用的)这样的框架可以自由地注入(inject)东西,但在调用构造函数之前它们不能这样做。因此,当调用构造函数时,所有 @Inject
注解字段都将为 null,您无法解决此问题。
所以,不要使用字段注入(inject),使用构造函数注入(inject),例如:
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");
}
}
构造函数注入(inject)不仅建议用于此用例,您还应该在任何地方使用它,它可以避免所有这些潜在问题。
关于java - 如何在启动时访问 Lagom 服务中的配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46411962/