玩法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 我使用以下指令:
- 定义导入:导入
javax.inject.*; import play.Configuration;
- 定义class属性:
@Inject private Configuration configuration;
- 在我的class
上使用配置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;
我正在尝试将 Playframework 应用程序从 2.4 迁移到 2.5.3,但我无法从 application.conf
文件中获取值:
在之前从application.conf
获取值我所做的是:
Play.application().configuration().getString("label")
现在 由于 Play.application()
已弃用,我应该使用依赖注入。基于 framework documentation 我使用以下指令:
- 定义导入:导入
javax.inject.*; import play.Configuration;
- 定义class属性:
@Inject private Configuration configuration;
- 在我的class 上使用配置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;