【发布时间】:2015-02-16 00:50:50
【问题描述】:
上下文是下一个:
我有一个使用 Spring 2.5 和 Struts 1.1 的 Web 应用程序 我使用 Quartz 在 Action 中动态创建作业:
JobDetailBean jobDetail = new JobDetailBean();
jobDetail.setBeanName("foo");
Map<String, String> map = new HashMap<String,String>();
map.put("idFeed","foo");
map.put("idSite","foo");
jobDetail.setJobDataAsMap(map);
jobDetail.setJobClass(FeedJob.class);
jobDetail.afterPropertiesSet();
CronTriggerBean cronTrigger = new CronTriggerBean();
cronTrigger.setBeanName("foo");
String expression = " * * * * * *";
cronTrigger.setCronExpression(expression);
cronTrigger.afterPropertiesSet();
// add to schedule
scheduler.scheduleJob((JobDetail) jobDetail, cronTrigger);
scheduler 是注入到 Action 中的 org.quartz.Scheduler。
FeedJob 类具有 executeInternal(JobExecutionContext ctx) 方法,这是作业必须运行的代码:
public class FeedJob extends QuartzJobBean {
private FeedBL feedBL;
public void setFeedBL(FeedBL feedBL) {this.feedBL = feedBL;}
public FeedJob() {}
public String idFeed;
public String idSite;
public String getIdFeed() {
return idFeed;
}
public void setIdFeed(String idFeed) {
this.idFeed = idFeed;
}
public String getIdSite() {
return idSite;
}
public void setIdSite(String idSite) {
this.idSite = idSite;
}
protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {
try {
feedBL.sincronizacionProductFeed(idFeed, idSite);
} catch (Exception e) {
e.printStackTrace();
}
}
}
当它要运行时,我在尝试运行这行代码时得到一个 java.lang.NullPointerException:
feedBL.sincronizacionProductFeed(idFeed, idSite);
原因是当我在设置作业的操作中创建作业时:
jobDetail.setJobClass(FeedJob.class);
而且 Spring 并没有注意到他已经创建的 bean,因此 FeedJob 类的实例没有上帝注入 feedBL 类。
有解决这个问题的好主意吗? 我试图给这份工作提供这样的背景:
jobDetail.setApplicationContext(applicationContext);
但是没有用。
【问题讨论】:
标签: spring nullpointerexception quartz-scheduler