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

时间:2016-08-24 13:38:58

标签: java playframework dependency-injection guice

我正在尝试使用play 2.5.4将示例数据加载到我的数据库中 最初我正在关注https://www.playframework.com/documentation/2.2.x/JavaGuide1

上的教程

但是因为它是为Play 2.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"));
            }
        }
    }
}

编辑:失败并出现以下异常

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

所以我想我应该以某种方式注入Ebean和Yaml。但我只使用这些类中的静态方法。 有人可以帮我理解如何做到这一点以及为什么。

1 个答案:

答案 0 :(得分:2)

如果您查看@Component()的{​​{3}},我们可以看到它在第20行使用静态Yaml.java。这就是为什么您会收到错误的原因,因为没有申请开始。

此外,Play.current()将在2.6中弃用,因此我建议您关注code。它解释了如何解决您的问题:

  1. Yaml
  2. 添加依赖项
  3. 创建自己的snakeyaml
  4. 在其中注入Yaml
  5. 修改

    然后注入Application类,不要使用静态方式:

    Yaml