Spring+Mybatis整合时Caused by: java.lang.IllegalArgumentException错误

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)
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242)
at org.mybatis.spring.mapper.ClassPathMapperScanner.doScan(ClassPathMapperScanner.java:155)
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.scan(ClassPathBeanDefinitionScanner.java:220)
at org.mybatis.spring.mapper.MapperScannerConfigurer.postProcessBeanDefinitionRegistry(MapperScannerConfigurer.java:315)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at cn.gts.ssm.test.UserMapperTest.testFindUserById(UserMapperTest.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:69)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:292)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.IllegalArgumentException
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:257)
... 32 more
==========================================================================================================================================

原因分析:

    可以看到主要的错误信息是Caused by: java.lang.IllegalArgumentException,最后这个单词的意思是“非法的数据异常”,主要原因是由于jdk版本和spring的相关jar包的版本有冲突,也就是,spring的版本过低和jdk8的版本会出现这个问题。
解决方案:
    我原来采用的是spring3.2.0的版本jdk8.0的版本,就出现了这个问题,然后我把spring的所有jar包都升级到了4.2.4的版本,然后测试正常。

相关jar包下载:     

下载流程:

    1.打开上述链接得到如下页面

 2.向下滑动找到要下载的版本点进去(以4.2.4为例)


3.得到如下

我们只需要下载第一个zip就好。
4.解压后找到libs文件夹下找到所有的jar包(不需要全部复制,用哪个选哪个就好)


最后

    把所要的相关jar包复制到你的项目中然后后替换掉原来的版本就好了!
  还有一点,当你替换下已经build path的jar后,在下一次启动eclipse后,会在那个项目前面出现红色感叹号,主要是有由于项目中还记录着原来版本的jar包,但是实际上已经不存在了。


解决方案

    **选中改项目,鼠标右键,在右键菜单中,依次找到:Build Path config build path或者Build Path configure build path。

    **会在下图出现许多spring3.2版本的jar包记录,而且带有红色叹号,将这些全部remove即可。(下图已经修改)


    这样就大功告成了!













### 错误分析 当遇到`java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required`错误,表明应用程序尝试初始化MyBatis Plus组件未能找到必要的SQL会话工厂或模板实例[^1]。 在Spring框架下,此异常通常意味着未正确配置MyBatis Mapper接口所需的依赖项。具体来说,在Spring的配置文件(无论是基于XML还是Java注解的方式),缺失了对`sqlSessionFactory`或`sqlSessionTemplate`属性的定义[^3]。 对于采用Spring Boot与MyBatis Plus集成的应用程序而言,该问题可能源于不兼容版本间的冲突。有报告指出,使用特定版本范围内的Spring Boot(如3.1.2)可以避免此类问题的发生;而更高版本可能会引发新的兼容性挑战[^4]。 ### 解决方案建议 为了修复上述提到的问题并成功实现Spring Boot和MyBatis Plus之间的无缝协作,可采取如下措施: #### 方法一:确保正确引入依赖库 确认项目中的构建工具(Maven/Gradle)已包含适当版本的MyBatis Spring包而非仅限于MyBatis Plus整合包。这有助于防止潜在的功能覆盖或遗漏。 ```xml <!-- Maven pom.xml --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>相应稳定版号</version> </dependency> <!-- 如果需要额外功能支持 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>对应版本</version> </dependency> ``` #### 方法二:检查Bean注册情况 验证是否存在用于创建`SqlSessionFactory` Bean的方法,并将其暴露给整个应用上下文以便其他组件能够自动注入这些资源。可以通过自定义配置类来完成这项工作。 ```java @Configuration public class MyBatisConfig { @Bean(name = "sqlSessionFactory") public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); // 配置Mapper XML路径等... PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sessionFactory.setMapperLocations(resolver.getResources("classpath*:mapper/*.xml")); return sessionFactory.getObject(); } } ``` #### 方法三:调整Spring Boot版本 如果当前使用的Spring Boot版本较高且遇到了难以解决的技术难题,则考虑回退到更稳定的较低版本(例如3.1.x系列)。这样做虽然不是长久之计,但在短期内可以帮助绕过某些尚未完全适配的新特性所带来的障碍。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值