【发布时间】:2018-08-18 15:15:33
【问题描述】:
我正在使用 dropwizard 1.0.5、dropwizard-guicey 4.0.1 (https://github.com/xvik/dropwizard-guicey)、spinscale quartz implementation 3.0.0 (https://github.com/spinscale/dropwizard-jobs)。
我希望能够将我的依赖项注入到quartz/spinscale 创建的作业实例中。为此,我尝试在以下库中加载https://github.com/spinscale/dropwizard-jobs/tree/master/dropwizard-jobs-guice
问题在于,当创建 Guice dropwizard 作业包时,Guice 注入器尚未初始化,所以我得到了一个 NPE。
示例:
MyApplication.java
@Override
public void initialize(Bootstrap<MyConfiguration> bootstrap) {
// Initialize Guice for dependency injection
GuiceBundle guiceBundle = GuiceBundle.builder()
.bindConfigurationInterfaces()
.enableAutoConfig(getClass().getPackage().getName())
.modules(new MyModule(bootstrap.getMetricRegistry()))
.build();
bootstrap.addBundle(guiceBundle);
bootstrap.addBundle(new GuiceJobsBundle(guiceBundle.getInjector()));
例外:
Exception in thread "main" java.lang.NullPointerException: Guice not initialized
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:226)
为了解决这个问题,我尝试创建自己的GuiceJobsBundle 版本,它接收GuiceBundle,并且在调用bundle.run() 之前不设置注入器。但是,我仍然获得了 NPE。
MyApplication
@Override
public void initialize(Bootstrap<MyConfiguration> bootstrap) {
// Substitute environment variable references in the configuration file
bootstrap.setConfigurationSourceProvider(new SubstitutingSourceProvider(
bootstrap.getConfigurationSourceProvider(),
new EnvironmentVariableSubstitutor(false, true)
));
// Initialize Guice for dependency injection
GuiceBundle guiceBundle = GuiceBundle.builder()
.bindConfigurationInterfaces()
.enableAutoConfig(getClass().getPackage().getName())
.modules(new MyModule(bootstrap.getMetricRegistry()))
.build();
bootstrap.addBundle(guiceBundle);
bootstrap.addBundle(new GuiceyJobsBundle(guiceBundle));
}
GuiceyJobsBundle
public class GuiceyJobsBundle extends JobsBundle {
private GuiceBundle guiceBundle;
public GuiceyJobsBundle(GuiceBundle guiceBundle) {
this.guiceBundle = guiceBundle;
}
@Override
public void run(Environment environment) {
JobManager jobManager = new GuiceJobManager(guiceBundle.getInjector());
environment.lifecycle().manage(jobManager);
}
}
什么时候调用 bundle 的 run() 方法?有没有人找到一个可行的解决方案?
【问题讨论】:
标签: java java-8 quartz-scheduler guice dropwizard