2 Stimmen

Nullpointer Ausnahme beim Quartz-Integration mit Spring

Ich arbeite an einem Spring-Hibernate-Projekt Versuche, eine Verbindung zur Datenbank herzustellen und die Werte aus dem Quartz-Job abzurufen. erhalte jedoch eine Nullzeigerausnahme. Als ich versuchte, ein ApplicationContext-Objekt zu verwenden und das Bean abzurufen, wurde eine Verbindung zur Datenbank hergestellt, warum kann ich es nicht andersherum machen

public class JobScheduler extends QuartzJobBean {
    @Autowired
    private SourceDaoImpl sourceDao;
    @Override
    protected void executeInternal(JobExecutionContext arg0)
            throws JobExecutionException {
        Client client = new Client();
        client.setClientKey(300);

        sourceDao.getSourceByClient(client); **//error**
    }
    public SourceDaoImpl getSourceDao() {
        return sourceDao;
    }
    public void setSourceDao(SourceDaoImpl sourceDao) {
        this.sourceDao = sourceDao;
    }
}

Das ist meine applicationcontext.xml

Dies ist die Ausnahme

ERROR 04-06 07:22:55,009 - Job DEFAULT.jobScheduler warf eine unbehandelte Ausnahme: 
java.lang.NullPointerException
    at com.dca.scheduling.JobScheduler.executeInternal(JobScheduler.java:21)
    at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)
ERROR 04-06 07:22:55,010 - Job (DEFAULT.jobScheduler warf eine Ausnahme.
org.quartz.SchedulerException: Job warf eine unbehandelte Ausnahme. [Siehe nested exception: java.lang.NullPointerException]
    at org.quartz.core.JobRunShell.run(JobRunShell.java:227)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)
Verursacht durch: java.lang.NullPointerException
    at com.dca.scheduling.JobScheduler.executeInternal(JobScheduler.java:21)
    at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
    ... 1 more

hibernate.xml

2voto

jos Punkte 1082

Quartz läuft in seinem eigenen Kontext, auch wenn es von den Spring-Komfortmethoden gestartet wird, so dass Sie tatsächlich nicht den gesamten Spring-Anwendungskontext erhalten, es sei denn, Sie fügen explizit eine JobDataMap hinzu, um Beans zu übergeben

meine Job-Scheduler-Klasse

protected void executeInternal(JobExecutionContext jobContext)
            throws JobExecutionException {
        Client client = new Client();
        client.setClientKey(300);
        sourceDao= (SourceDaoImpl) jobContext.getJobDetail()
                .getJobDataMap().get("sourceDao");
}

1voto

Dariusz Punkte 20520

Die Antwort ist leider einfach: sourceDao ist null.

Quartz instanziiert die Job-Klassen selbst. Der einzige Weg, um einen Parameter an diese Klasse zu übergeben, ist die Verwendung des JobExecutionContext in executeInternal().

Zuerst, wenn Sie scheduleJob() aufrufen, müssen Sie die JobDetails festlegen.

JobDetail thisJobDetail = new SimpleJobDetail(this.getClass().getName(), (Class>) this.getClass());
thisJobDetail.getJobDataMap().put(DATA_MANAGER_MAP_KEY,
                dataManager);

sched.scheduleJob(thisJobDetail ,aTrigger);

Dann, wenn Sie den Job ausführen, können Sie auf die Details wie folgt zugreifen:

this.dataManager = (DataManager) jobContext.getJobDetail()
                                 .getJobDataMap().get(DATA_MANAGER_MAP_KEY);

In Ihrem Fall verwenden Sie sourceDao als dataManager hier.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X