11

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

application.conf我所做的获得价值之前是:

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

现在Play.application()推荐使用,我应该使用依赖注入。根据框架文档,我使用以下说明:

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

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

但是当我尝试在项目中的其他类对象上使用它时,依赖注入不起作用,我总是得到一个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")

4

5 回答 5

6

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

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");
    }
}
于 2016-05-25T21:37:07.953 回答
3

尝试使用构造函数注入:

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字段。无论如何,构造函数注入是推荐的注入类型。

于 2016-05-02T03:42:31.803 回答
3

我把答案放在这里,以帮助任何有同样问题的人

我的错误来自我用来从调用类实例化我的 Zipper java 类的方式。

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

我用拉链 zipTest = new Zipper(); 要实例化我的 Zipper 类,我必须使用Zipper zipTest = injector.instanceOf(Zipper.class);

于 2016-05-02T21:12:08.673 回答
1

您应该尝试删除private. 采用:

@Inject Configuration configuration;

代替:

@Inject private  Configuration configuration;
于 2016-10-17T06:53:24.740 回答
0

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

于 2016-05-02T18:17:13.620 回答