我正在尝试将Playframework应用程序从2.4迁移到2.5.3,并且我有从中获取值的问题 application.conf
文件:
之前 从中获取值 application.conf
我做的是:
Play.application().configuration().getString("label")
现在 如 Play.application()
不推荐使用,我应该使用依赖注入。基于 框架文档 我使用以下说明:
- 定义导入:进口
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")
我认为您可以像这样初始化配置:
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");
}
}
尝试使用构造函数注入:
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
领域。无论如何,构造函数注入是推荐的注入类型。
我把答案放在这里,以帮助任何有同样问题的人
我的错误来自于我用来从我的调用类实例化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);
你应该尝试删除 private
。
使用:
@Inject Configuration configuration;
代替:
@Inject private Configuration configuration;
尝试使用Singleton注释您的类,以便play可以检测您的bean以注入您的资源。