CreationException:无法在 Play 2.5.18 中创建注入器错误以替换使用 com.google.inject.AbstractModule 的 GlobalSettings Java 代码

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/49638826/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 10:25:10  来源:igfitidea点击:

CreationException: Unable to create injector error in Play 2.5.18 in replacement for GlobalSettings Java code using com.google.inject.AbstractModule

javadependency-injectionplayframework

提问by Dan

I am upgrading my Play application from 2.5.12 to 2.5.18 and when I start up the application (using sbt), I am receiving this error:

我正在将我的 Play 应用程序从 2.5.12 升级到 2.5.18,当我启动应用程序(使用sbt)时,我收到此错误:

CreationException: Unable to create injector, see the following errors:

CreationException:无法创建注入器,查看以下错误:

1) Error injecting constructor, java.lang.NullPointerException
  at modules.OnStart.<init>(OnStart.java:15)
  at modules.Global.configure(Global.java:9) (via modules: com.google.inject.util.Modules$OverrideModule -> modules.Global)
  while locating modules.OnStart

1 error

The rest of the error is:

其余的错误是:

No source available, here is the exception stack trace:
->com.google.inject.CreationException: Unable to create injector, see the following errors:

1) Error injecting constructor, java.lang.NullPointerException
  at modules.OnStart.<init>(OnStart.java:15)
  at modules.Global.configure(Global.java:9) (via modules: com.google.inject.util.Modules$OverrideModule -> modules.Global)
  while locating modules.OnStart

1 error
     com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:470)
     com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:184)
     com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
     com.google.inject.Guice.createInjector(Guice.java:99)
     com.google.inject.Guice.createInjector(Guice.java:84)
     play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:181)
     play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:137)
     play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
     play.core.server.DevServerStart$$anon.$anonfun$get(DevServerStart.scala:171)
     play.utils.Threads$.withContextClassLoader(Threads.scala:21)
     play.core.server.DevServerStart$$anon.$anonfun$get(DevServerStart.scala:168)
     scala.Option.map(Option.scala:146)
     play.core.server.DevServerStart$$anon.$anonfun$get(DevServerStart.scala:133)
     scala.util.Success.flatMap(Try.scala:247)
     play.core.server.DevServerStart$$anon.$anonfun$get(DevServerStart.scala:131)
     scala.concurrent.Future$.$anonfun$apply(Future.scala:655)
     scala.util.Success.$anonfun$map(Try.scala:251)
     scala.util.Success.map(Try.scala:209)
     scala.concurrent.Future.$anonfun$map(Future.scala:289)
     scala.concurrent.impl.Promise.liftedTree1(Promise.scala:29)
     scala.concurrent.impl.Promise.$anonfun$transform(Promise.scala:29)
     scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60)
     scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:140)
     java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
     java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
     java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
     java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

I created new modules to replace the deprecated GlobalSettingsbased on this post:

GlobalSettings根据这篇文章创建了新模块来替换已弃用的模块:

https://www.playframework.com/documentation/2.5.x/GlobalSettings

https://www.playframework.com/documentation/2.5.x/GlobalSettings

Here are the classes mentioned in the error:

以下是错误中提到的类:

Global.java

全局.java

package modules;

import com.google.inject.AbstractModule;

public class Global extends AbstractModule {

    @Override
    public void configure() {
        bind(OnStart.class).asEagerSingleton();
        bind(OnStop.class).asEagerSingleton();
    }

}

OnStart.java

启动程序

package modules;

import javax.inject.Inject;
import javax.inject.Singleton;

import jobs.JobControl;
import com.typesafe.config.Config;
import play.Logger;

@Singleton
public class OnStart {

    @Inject
    public OnStart(Config config) {
        Logger.debug("Application started...");     
        // Turn on scheduler?
        String schedulerEnabled;
        String dueDateRun;
        schedulerEnabled = config.getString("scheduler.enabled");
        dueDateRun = config.getString("duedate.run.flag");
        if (schedulerEnabled.equals("true")) {
            //JobControl.cleanupTables();
            //JobControl.emptyRecycleBin();
            if (dueDateRun.equals("on")) {
                JobControl.dueDateNotifications();
            }
        }
    }
}

I am not sure what to do to fix this.

我不知道该怎么做才能解决这个问题。

采纳答案by Andriy Kuba

The configuration must be injected into the constructor

配置必须注入到构造函数中

@Inject
public OnStart(Config config) {