Java 如何在Play 2.5.4中使用Guice注入实用程序类
我正在尝试使用play 2.5.4将示例数据加载到我的数据库中 最初,我是在学习关于 但是因为它是为Play2.2编写的,所以我会尽我最大的努力来修改它,避免使用不推荐的东西 现在,我还是有点迷恋DI的东西 到目前为止,我所拥有的: application.confJava 如何在Play 2.5.4中使用Guice注入实用程序类,java,playframework,dependency-injection,guice,Java,Playframework,Dependency Injection,Guice,我正在尝试使用play 2.5.4将示例数据加载到我的数据库中 最初,我是在学习关于 但是因为它是为Play2.2编写的,所以我会尽我最大的努力来修改它,避免使用不推荐的东西 现在,我还是有点迷恋DI的东西 到目前为止,我所拥有的: application.conf play.modules.enabled += "GuiceConfiguration" GuiceConfiguration.java public class GuiceConfiguration extends Abstra
play.modules.enabled += "GuiceConfiguration"
GuiceConfiguration.java
public class GuiceConfiguration extends AbstractModule{
@Override
protected void configure() {
bind(OnStartupService.class).asEagerSingleton();
}
}
OnStartupService.java
@Singleton
public class OnStartupService {
@Inject
private OnStartupService(Environment environment) {
if (environment.isDev()) {
if (Issue.find.findRowCount() == 0) {
System.out.println("Okay");
}
}
}
}
以上代码工作正常
以下情况不适用:
@Singleton
public class OnStartupService {
@Inject
private OnStartupService(Environment environment) {
if (environment.isDev()) {
if (Issue.find.findRowCount() == 0) {
Ebean.saveAll((Collection<?>) Yaml.load("test-data.yml"));
}
}
}
}
@Singleton
公共类启动服务{
@注入
专用OnStartupService(环境){
if(environment.isDev()){
if(Issue.find.findRowCount()==0){
Ebean.saveAll((Collection)Yaml.load(“test data.yml”);
}
}
}
}
编辑:失败,出现以下异常
play.api.UnexpectedException: Unexpected exception[CreationException: Unable to create injector, see the following errors:
1) Error injecting constructor, java.lang.RuntimeException: There is no started application
at OnStartupService.<init>(OnStartupService.java:1)
at GuiceConfiguration.configure(GuiceConfiguration.java:9) (via modules: com.google.inject.util.Modules$OverrideModule -> GuiceConfiguration)
while locating OnStartupService
play.api.UnexpectedException:意外异常[CreationException:无法创建注射器,请参阅以下错误:
1) 注入构造函数java.lang.RuntimeException时出错:没有启动的应用程序
在OnStartupService。(OnStartupService.java:1)
在GuiceConfiguration.configure(GuiceConfiguration.java:9)(通过modules:com.google.inject.util.modules$OverrideModule->GuiceConfiguration)
在启动服务上定位时
所以我想我应该以某种方式注入Ebean和Yaml,但我只使用这些类中的静态方法。
有人能帮我理解怎么做以及为什么这样做。如果你看一下Yaml.java,我们可以看到它在第20行使用了staticPlay.current()
。这就是为什么你会出现错误,因为没有启动任何应用程序
此外,Yaml
将在2.6中被弃用,因此我建议您遵循。它解释了如何解决您的问题:
snakeyaml
Yaml
类应用程序
注入其中Yaml
类,不要使用静态方式:
@Singleton
public class OnStartupService {
@Inject
private OnStartupService(Environment environment, Yaml yaml) {
if (environment.isDev()) {
if (Issue.find.findRowCount() == 0) {
Ebean.saveAll((Collection<?>) yaml.load("test-data.yml"));
}
}
}
}
@Singleton
公共类启动服务{
@注入
私有OnStartupService(环境,Yaml Yaml){
if(environment.isDev()){
if(Issue.find.findRowCount()==0){
Ebean.saveAll((Collection)yaml.load(“test data.yml”);
}
}
}
}
好的,谢谢。但是链接中的示例是错误的。他们正在尝试访问实例变量(环境)从静态上下文中。完全正确!看起来有错误。好的,再次感谢。我稍后再试。我的意思是在您链接的迁移指南中。他们有一个Yaml的示例。classWorks与您描述的完全相同。请不要编辑您的问题并将答案放在问题中,特别是当有一个不同的已接受答案时!这不是一个论坛。提问是为了提问,回答是为了回答,评论是为了回答任何不是问题或答案的东西。请接受答案并将其作为正确的答案。好的,明白了。既然我明白了问题的真正含义,那么换个话题好吗?