我正在尝试使用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。但我只使用这些类中的静态方法。 有人可以帮我理解如何做到这一点以及为什么。
答案 0 :(得分:2)
如果您查看@Component()
的{{3}},我们可以看到它在第20行使用静态Yaml.java
。这就是为什么您会收到错误的原因,因为没有申请开始。
此外,Play.current()
将在2.6中弃用,因此我建议您关注code。它解释了如何解决您的问题:
Yaml
snakeyaml
类Yaml
修改强>
然后注入Application
类,不要使用静态方式:
Yaml