我正在尝试将Playframework应用程序从2.4迁移到2.5.3,但我从application.conf
文件中获取值时遇到问题:
在之前获取application.conf
的值,我的工作是:
Play.application().configuration().getString("label")
现在,因为Play.application()
已弃用,我应该使用依赖注入。基于framework documentation,我使用以下说明:
javax.inject.*; import play.Configuration;
@Inject private Configuration configuration;
当我在控制器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")
答案 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以注入您的资源。