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

How to access configuration in a Lagom service at startup?

我正在将 Spring/J2EE 中的当前应用程序迁移到 Lagom。我在 Java 工作。我需要从配置中读取变量(资源文件夹中的application.conf)。在实现模块中,我尝试像这样

将配置作为 class 变量注入

@注入 私人配置配置

但是当我在构造函数中访问这个配置对象时,它给出了空指针异常。

整个代码是这样的

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 中的配置,并可能存储在一些配置 class 中,以后可以在任何地方访问。

在Java中,当一个对象被实例化时,首先发生的事情(在其他任何事情可能发生之前)是调用构造函数。在那之后,像 Guice(Lagom 使用的)这样的框架可以自由地注入东西,但是在调用构造函数之前它们不能这样做。因此,当调用构造函数时,所有 @Inject 带注释的字段都将为空,您无能为力。

所以,不要使用字段注入,使用构造函数注入,eg:

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

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