SpringTask添加定时任务出错

来源:6-4 订单模块_SpringTask实现定时更新

Unlimitedbladewo0

2017-12-03

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

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回答

源生活

2017-12-03

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

0
7
源生活
回复
Unlimitedbladewo0
和加载顺序、获取Bean的方式等等有关,当对这些区别敏感时,不同的配置方式就会有区别,使用时不受这个影响(不敏感)就都可以,所以有时会出现两种配置。根据你这里的情况,我还没试过,但猜测是task类里注入mybatis,配置方式的不同应该是有影响的,正好你这里抛异常了,可以把框架源码加进来追踪一下异常产生的原因,视频里也有一小段是追踪源码解决问题的,不过根据异常的信息,需要反射与动态代理的知识是必须的,因为我看异常里出现了【Proxy】,你可以看看。
2017-12-03
共7条回复

Unlimitedbladewo0

提问者

2017-12-03

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

@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
0

IT段子手详解MyBatis遇到Spring 秒学Java SSM开发大众点评

【毕设】SSM全面梳理,前后端分离,zTree 和复杂SQL打造权限系统,解惑MyBatis和RESTful

1001 学习 · 485 问题

查看课程