问题
spring boot项目在线上一直正常运行没有错误,然后今天发生了报错,如图
这是一个定时器错误,发生这个报错
主要有两个原因
- 定时器编写的有错误
- @Scheduled注解方式级别高于资源注入级别,导致了资源注入失败
以下是我的代码
@RestController
@Slf4j
@SuppressWarnings({"all"})
@CrossOrigin
@RequestMapping("/journal")
@Component
public class JournalController {@AutowiredJournal_timeMapper journal_timeMapper;/*** 每周日将签到时间数据清空*/@Scheduled(cron = "0 0 0 * * SUN")public void journaltimeout() {List<Journal_time> journal_times = journal_timeMapper.selectList(null);for (Journal_time journal_time : journal_times) {journal_time.setDay_time("0小时0分钟");journal_time.setWeek_time("0小时0分钟");journal_time.setAll_time("0小时0分钟");journal_time.setWeek_time_desc("第0名");journal_timeMapper.updateById(journal_time);}}/*** 每天晚上将一天签到数据清空*/@Scheduled(cron = "0 0 0 * * ?")public void daytimeout() {List<Journal_time> journal_times = journal_timeMapper.selectList(null);for (Journal_time journal_time : journal_times) {journal_time.setDay_time("0小时0分钟");journal_timeMapper.updateById(journal_time);}}
}
有一个特别奇怪的点,就是我的daytimeout方法一直在生效,但是journaltimeout却报错了,这都是在一个Controller下面(我直接晕厥)–目前还没有找到原因,先说解决方法
解决方法
使用ApplicationContextAware,它实现了这个接口的bean,当spring容器初始化的时候,会自动的将ApplicationContext注入进来
修改后的代码
@RestController
@Slf4j
@SuppressWarnings({"all"})
@CrossOrigin
@RequestMapping("/journal")
@Component
public class JournalController implements ApplicationContextAware {private static ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {context = applicationContext;}public static ApplicationContext getApplicationContext() {return context;}public static Object getBean(String name) {return getApplicationContext().getBean(name);}/*** 每周日将签到时间数据清空*/@Scheduled(cron = "0 0 0 * * SUN")public void journaltimeout() {Journal_timeMapper journal_timeMapper = (Journal_timeMapper)this.getBean("journal_timeMapper");List<Journal_time> journal_times = journal_timeMapper.selectList(null);for (Journal_time journal_time : journal_times) {journal_time.setDay_time("0小时0分钟");journal_time.setWeek_time("0小时0分钟");journal_time.setAll_time("0小时0分钟");journal_time.setWeek_time_desc("第0名");journal_timeMapper.updateById(journal_time);}}/*** 每天晚上将一天签到数据清空*/@Scheduled(cron = "0 0 0 * * ?")public void daytimeout() {Journal_timeMapper journal_timeMapper = (Journal_timeMapper)this.getBean("journal_timeMapper");List<Journal_time> journal_times = journal_timeMapper.selectList(null);for (Journal_time journal_time : journal_times) {journal_time.setDay_time("0小时0分钟");journal_timeMapper.updateById(journal_time);}}
}