玩法2.5.3:使用依赖注入获取配置值

Play 2.5.3: Using dependency injection to get configuration values

我正在尝试将 Playframework 应用程序从 2.4 迁移到 2.5.3,但我无法从 application.conf 文件中获取值:

之前从application.conf获取值我所做的是:

Play.application().configuration().getString("label")

现在 由于 Play.application() 已弃用,我应该使用依赖注入。基于 framework documentation 我使用以下指令:

  1. 定义导入:导入javax.inject.*; import play.Configuration;
  2. 定义class属性:@Inject private Configuration configuration;
  3. 在我的class
  4. 上使用配置class属性

当我在我的控制器上按照这些说明操作时 Application.java 它运行良好:

但是当我尝试在项目中的另一个 class 对象上使用它时,依赖项注入不起作用,我总是得到 NullPointerException.

谁能给我一个例子,说明如何使用依赖注入从 application.conf 获取值?

我尝试使用 DI 的 java 代码的某些部分:

import javax.inject.Inject;
import play.Configuration;
import play.Logger;

public class Zipper {

    @Inject private  Configuration configuration;

    public void unZip(String zipFilePath) {
        Logger.debug("Display : zipFilePath"+zipFilePath);
        Logger.debug("before call parameter from application.conf");
        Logger.debug("configuration.getString = "+configuration.getString("Unzipedfile.path"));
        Logger.debug("aftercall parameter from application.conf");
    }
}

而且我总是在 configuration.getString("Unzipedfile.path")

行得到一个空指针异常

尝试使用构造函数注入代替:

import javax.inject.Inject;
import play.Configuration;
import play.Logger;

public class Zipper {

    private Configuration configuration;

    @Inject
    public Zipper(Configuration config) {
        this.configuration = config;
    }

    public void unZip(String zipFilePath) {
        Logger.debug("Display : zipFilePath"+zipFilePath);
        Logger.debug("before call parameter from application.conf");
        Logger.debug("configuration.getString = "+configuration.getString("Unzipedfile.path"));
        Logger.debug("aftercall parameter from application.conf");
    }
}

我不确定 Guice 是否能够注入 private 字段。不管怎样,构造函数注入是推荐的注入类型。

尝试用 Singleton 注释您的 class 以便 play 可以检测到您的 bean 以注入您的资源。

我把答案放在这里,以帮助遇到同样问题的人

我的错误来自于我通过调用 class.

实例化 Zipper java class 的方式

感谢 Igmar Palsenberg,他为我提供了答案: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!topic/play-framework/uLFqTM9_Iy4

我使用 Zipper zipTest = new Zipper(); 来实例化我的 Zipper class 并且我必须使用 Zipper zipTest = injector.instanceOf(Zipper.class);

我认为您可以像这样初始化配置:

private  Configuration configuration = Play.current().injector().instanceOf(Configuration .class);

因此,您的 Zipper 将是:

import javax.inject.Inject;
import play.Configuration;
import play.Logger;

public class Zipper {

    private  Configuration configuration = Play.current().injector().instanceOf(Configuration .class);

    public void unZip(String zipFilePath) {
        Logger.debug("Display : zipFilePath"+zipFilePath);
        Logger.debug("before call parameter from application.conf");
        Logger.debug("configuration.getString = "+configuration.getString("Unzipedfile.path"));
        Logger.debug("aftercall parameter from application.conf");
    }
}

您应该尝试删除 private。 使用:

@Inject Configuration configuration;

而不是:

@Inject private  Configuration configuration;