如何在启动时访问Lagom服务中的配置?

时间:2017-09-25 18:33:21

标签: java lagom

我正在将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中的配置,并可能存储在某个配置类中,以后可以在任何地方访问。

1 个答案:

答案 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");
  }
}

构造函数注入不仅仅推荐用于此用例,您应该在任何地方使用它,它可以避免所有这些潜在的问题。