播放2.5.3:使用依赖注入来获取配置值

时间:2016-05-01 21:42:08

标签: java playframework dependency-injection playframework-2.5

我正在尝试将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. 定义类属性@Inject private Configuration configuration;
  3. 使用我班级的配置类属性
  4. 当我在控制器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")

    的行上得到一个空指针异常

5 个答案:

答案 0 :(得分:6)

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

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

所以,你的拉链将是:

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

答案 1 :(得分: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个字段。无论如何,构造函数注入是推荐的注入类型。

答案 2 :(得分:3)

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

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

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

我使用 Zipper zipTest = new Zipper(); 来实现我的Zipper类,我必须使用 Zipper zipTest = injector.instanceOf(Zipper.class); < / p>

答案 3 :(得分:1)

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

@Inject Configuration configuration;

而不是:

@Inject private  Configuration configuration;

答案 4 :(得分:0)

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