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

标签 java lagom

我正在将 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/

相关文章:

java - 如何在Spring Boot中的application.properties中指定外部属性文件?

akka - akka Scheduler 是单例吗?

java - 线程行为

java相当于unsigned long long不就是BigInteger吗?

microservices - Lagom 服务如何使用其他服务?

java - IntelliJ 中的不可变和 Lagom

java - Lagom 服务使用来自 Kafka 的输入

java - Lagom 框架中的单元测试范例是什么?

java - Apache 点燃 IGFS : Start reading large file before write completes

java - Couchbase Analytics Java SDK 连接创建 + 安全角色