Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Play 2.5.4中使用Guice注入实用程序类_Java_Playframework_Dependency Injection_Guice - Fatal编程技术网

Java 如何在Play 2.5.4中使用Guice注入实用程序类

Java 如何在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 2.5.4将示例数据加载到我的数据库中 最初,我是在学习关于

但是因为它是为Play2.2编写的,所以我会尽我最大的努力来修改它,避免使用不推荐的东西

现在,我还是有点迷恋DI的东西

到目前为止,我所拥有的:

application.conf

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行使用了static
Play.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与您描述的完全相同。请不要编辑您的问题并将答案放在问题中,特别是当有一个不同的已接受答案时!这不是一个论坛。提问是为了提问,回答是为了回答,评论是为了回答任何不是问题或答案的东西。请接受答案并将其作为正确的答案。好的,明白了。既然我明白了问题的真正含义,那么换个话题好吗?