首页 文章

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

提问于
浏览
0

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

@Inject private Configuration config

但是当我在构造函数中访问此配置对象时,它会给出空指针异常 .

整个代码是这样的

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 回答

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

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

相关问题