请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

SpringTask添加定时任务出错

注册自己写的定时任务时遇到这个错误:

Fail to instantiate [org.springframework.scheduling.support.ScheduledMethodRunnable]: Constructor threw exception; nested exception is java.lang.NoSuchMethodException: $Proxy27.saveRecord()


java代码:

packge com.icbc.gdjm.bcms.task;

@Component("StoreRecordTask")
public class StoreRecordTask {
    private static final Logger log = LoggerFactory.getLogger(StoreRecordTask.class);
    
    @Inject
    private ItemStoreDao itemStoreDao;
    
    @Transactional
    public void saveRecord() {
        int flag = 0;
        try {
            flag = itemStoreDao.saveStoreLog();
            if (flag == 1) {
                log.info("更新了库存");
            } else {
                log.info("异常,请查看数据库!");
            }            
        } catch (Exception e) {
            log.warn("任务异常!");
        }
    }
    
}

配置文件:

<context:component-scan base-package="com.icbc.gdjm.bcms.task"></context:component-scan>

<task:scheduled-tasks>
    <task:scheduled ref="StoreRecordTask" method="saveRecord" cron="0 55 22 * * ?" />
</task:scheduled-tasks>


如果把dao层的注入去掉,直接手写jdbc就不会报错,网上查原因说是private造成的,但我的方法是public的,不知道怎么解决?

正在回答

2回答

除了@Inject注解,和视频里的没什么区别,你再看看其他方面有没有区别,你可以运行完整版代码,然后把你写的内容一点一点往完整版里加。

0 回复 有任何疑惑可以回复我~
  • 提问者 Unlimitedbladewo0 #1
    我试过 autowired  resource也是报同样的错误
    
    不过我的spring ioc容器加载不同 只有web层是通过dispatcherservlet加载,
    其他都是通过contextloaderlistener加载的 这应该不会有影响吧
    回复 有任何疑惑可以回复我~ 2017-12-03 12:59:24
  • 源生活 回复 提问者 Unlimitedbladewo0 #2
    如果你有其他配置与视频中不同,可能会造成这样的问题,最好是先按视频里的正确执行一次以后,再换成你想要的配置再试。
    回复 有任何疑惑可以回复我~ 2017-12-03 13:29:54
  • 提问者 Unlimitedbladewo0 #3
    好奇葩啊,如果我不直接调用Dao层,而是在服务层里写方法调用Dao层,然后在定时任务里注入服务层调用里面的Dao方法就没报错,虽然问题解决了,但是搞不清楚啥原因。
    回复 有任何疑惑可以回复我~ 2017-12-03 15:15:16
提问者 Unlimitedbladewo0 2017-12-03 15:21:18

修改了代码,增加了服务层:

@Service
public class ApiServiceImpl implements ApiService {
    @Inject
    private ItemStoreDao itemStoreDao;
    
    @Transactional
    public boolean saveStoreLog() {
        return 1 == itemStoreDao.saveStoreLog();
    }
}
packge com.icbc.gdjm.bcms.task;
 
@Component("StoreRecordTask")
public class StoreRecordTask {
    private static final Logger log = LoggerFactory.getLogger(StoreRecordTask.class);
     
    @Inject
    private ApiService apiService;
     
    public void saveRecord() {
        try {
            if (apiService.saveStoreLog()) {
                log.info("更新了库存");
            } else {
                log.info("异常,请查看数据库!");
            }            
        } catch (Exception e) {
            log.warn("任务异常!");
        }
    }
     
}

然后。。。。。。。就可以了。。。。。什么鬼,直接调用Dao就出错,虽然问题解决了,但是很不爽。。。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信