controller 中@autowired 报错_quartz(四)如何在job中使用spring自动注入

本文探讨了在Quartz Job实现类中,使用`@Autowired`和`@Resource`注解时遇到的空指针异常问题。原因在于Job没有被加入到Spring容器中,因此无法进行自动注入。解决办法是将Job实例化过程纳入Spring管理,通过自定义JobFactory将Spring上下文注入,确保注入成功。文章详细介绍了实现这一功能的代码配置和测试结果,最终展示了一个无空指针异常的正常任务执行案例。
摘要由CSDN通过智能技术生成

b104d894843d8e2d6f1dcde10c970117.png

跨年篇:祝愿大家万事随心,吃饭吃得饱,睡觉睡得好,没有烦扰。

一、背景

我在Job实现类中使用@Resource和@Autowired注入mapper类时,出现了如下的错误:

2020-12-31 20:41:07.311 ERROR 22456 --- [eduler_Worker-5] org.quartz.core.ErrorLogger              : Job (repeat.test2 threw an exception.

org.quartz.SchedulerException: Job threw an unhandled exception.
 at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
 at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: java.lang.NullPointerException: null
 at com.example.docker_images.job.HelloJob.execute(HelloJob.java:26)
 at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
 ... 1 common frames omitted
  1. 为啥会有空指针?

答:出现这个原因是没有注入成功,所以为null,再通过这个对象调用mapper的方法不报错才怪。

  1. 这里你会很奇怪吧,明明使用了@Resource和@Autowired来注入,为什么注入后的对象还是null呢?

答:这里我来解释一下,这个是因为Job的实现类并没有加入到spring容器中,自然无法使用自动注入。

  1. 那进入今天的主题吧,怎么在Job实现类中使用spring的自动注入呢?

答:自然是将Job加入到Spring容器中,然后就可以执行自动注入了。 事先申明一下,这篇文章是在quartz(三)任务持久化-jdbc篇(一看就会)上优化的,有兴趣的可以看一下三。注入方式如下:

二、代码实现

通用代码(在三的基础上加了数据库的操作):

import com.example.docker_images.entity.User;
import com.example.docker_images.entity.common.CwConstant;
import com.example.docker_images.service.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.Resource;
import java.util.List;

@Slf4j
public class HelloJob implements Job {

    @Resource
    private IUserService iUserService;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //通过jobDetail获取数据
        String payload = context.getTrigger().getJobDataMap().getString(CwConstant.PAYLOAD);
        System.out.println(payload);
        System.out.println("hello world!!!");
        List<User> list = iUserService.list();
        System.out.println(list.size());
    }
}

1. pom配置

<!-- Quartz坐标 -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>
<!--springboot-quartz-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

2. 通过配置类将spring上下文注入到JobFactory中

  1. spring容器操作类
import org.quartz.spi.TriggerFiredBundle;
im
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值