Spring+Mybatis整合时 Failed to read candidate component class,Caused by:IllegalArgumentException
Spring+Mybatis整合时Caused by: java.lang.IllegalArgumentException错误
org.springframework.beans.factory.BeanDefinitionStoreException:
Failed to read candidate component class:
file [E:\workspace\spring_mybatis\bin\cn\gts\ssm\mapper\UserMapper.class];
nested exception is java.lang.IllegalArgumentException
org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.
findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:281)
原因分析:
可以看到主要的错误信息是Caused by: java.lang.IllegalArgumentException,最后这个单词的意思是“非法的数据异常”,
主要原因是由于jdk版本和spring的相关jar包的版本有冲突,也就是,spring的版本过低和jdk8的版本会出现这个问题。
解决方案:
1,升级spring
1,1,我原来采用的是spring3.2.0的版本jdk8.0的版本,就出现了这个问题,然后我把spring的所有jar包都升级到了4.2.4的版本,然后测试正常。
1,2,我使用的JDK8,在JDK版本上面不要妥协,我也遇到过这个错误,mybatis用的3.2.7,spring我换成spring3.2.9或以上就OK了,
当然,spring的最低运行版本我没测过
当然,spring的最低运行版本我没测过
2,降jdk
ps:经过断点,发现在ClassReader(springcore.jar中的)类中出现了异常(读取:自动扫描mybatis的mapper代理接口类出错。)
spring3.2的源码包中没有该类,开发包中有该类的字节码。
这时候 问题来了 找了spring3.0.5的源码,在eclipse里面一个一个设置起来 最后发现下载的源码jar( org.springframework.asm-3.0.5.RELEASE.jar)竟然没有源码 全部是class 难道 我下载 错了? 又去折腾n久 发现 下的git源码还是jar源码 都是清一色没有asm源码 Spring基于ASM 2.2.3重新打包了spring-asm,包名变成org.springframework.asm.*,但是代码完全没有修改 将相应的类全部替换也可以正常运行 那么问题来了,是不是Spring是觉得把别人的代码放到自己项目里,感到不好意思,才不提供源代码的呢? 也许 只有他们自己才知道 顺便 吐槽下 spring 弄的下载方式实在太不人性了,现在基本只能git去官方下东西了
java.lang.IllegalArgumentException at org.springframework.asm.ClassReader.<init>(Unknown Source)