用Java玩2.6-添加环境依赖注入



我需要在我的一个java类中使用Play.Environment,如下所示。我正在使用Play 2.6.x。你能帮助我理解如何在这里添加依赖项注入吗。我尝试使用如下,但env对象显示为NULL。

MyFile.java

public final class MyFinalClass  {
@Inject
static Environment env;
public static String getFilePath(String fileName)  {
return env.rootPath().getAbsolutePath();
}
static {
//It has a static block and some code here. I dont have any constructor.
}
}

感谢

/***************************************************************************/我已经修改了上面的代码,并使其成为Singleton如下:

MyFinalClass.java
public class MyFinalClass   implements IConfigurationManager {
@Inject Environment env;
private static MyFinalClass   INSTANCE;
//Pvt Constructor
private MyFinalClass  () {
}
//Create Singleton Instance
public static MyFinalClass instance() {
if(INSTANCE == null) {
INSTANCE = new MyFinalClass();
}
return INSTANCE;
}
}
//Module.java
class Module extends AbstractModule {
@Override 
protected void configure( {
bind(MyFinalClass.class).asEagerSingleton();
}

这里我得到的错误是:类必须有一个(并且只有一个(用@Inject注释的构造函数,或者有一个非私有的零参数构造函数

然后我修改如下:

Environment env;
//Pvt Constructor
@Inject private MyFinalClass  (Environment env) {
this.env = env;
}

在这里,我得到了新的MyFinalClass期望参数的编译问题。你能帮忙吗。

感谢

不建议静态字段注入。如果你真的需要让你的类和方法是静态的,你应该使用Guice的requestStaticInjection(..(。您也可以使MyFinalClass成为Singleton,在构造函数中注入Environment,然后在需要使用getFilePath(..(的任何地方注入MyFinalClass.

编辑:我看到你对requestStaticInjection的评论,所以这里有一个关于如何使用它的简短描述。老实说,我认为只让类成为Singleton更整洁。如果你在MyFinalClass中有不想包含在Singleton中的东西,也许你应该创建一个新的类。

要使用requestStaticInjection((,您必须从一个模块进行请求,并且需要加载该模块。

public class InjectorModule extends AbstractModule {
@Override
protected void configure() {
requestStaticInjection(MyFinalClass.class);
}
}

编辑2:您现在已将问题改为使用Singleton,但您做得不对。查看Play文档,您只需将@Singleton注释添加到您的类中即可。

示例中,我们创建了一个singleton和一个注入它的控制器类(我直接在编辑器中编写,不是经过测试的代码,但你已经明白了(:

@Singleton
public class MyFinalClass {
private Environment env;
@Inject
public MyFinalClass(Environment env) {
this.env = env;
}
public String getFilePath(String fileName) {
return env.rootPath().getAbsolutePath();
}
}
public class TestController extends Controller {
@Inject
private MyFinalClass myFinalClass;
public Result index() {
String fileName = "test.tst";
String filePath = myFinalClass.getFilePath(fileName);
return ok(filePath);
}
}

最新更新