mybatis和spring整合时这个报错,应该这样解决!
01
問題描述
今天在寫mybatis和spring整合的時候,出現(xiàn)了個問題,其實(shí)也沒有多難,就是自己沒有仔細(xì)看,特此記錄一下。
報(bào)錯問題如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'empService'?defined in?class path resource [applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type?'org.mybatis.spring.mapper.MapperScannerConfigurer'?to required type?'org.dao.EmpDaoMapper'?for?property 'empDao'; nested exception is java.lang.IllegalStateException: Cannot convert value of type?[org.mybatis.spring.mapper.MapperScannerConfigurer] to required type?[org.dao.EmpDaoMapper] for?property 'empDao': no matching editors or conversion strategy foundat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:636)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:934)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)at org.test.TestMain.before(TestMain.java:21)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:606)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.RunBefores.evaluate(RunBefores.java:27)at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)at org.junit.runners.ParentRunner.run(ParentRunner.java:236)at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type?'org.mybatis.spring.mapper.MapperScannerConfigurer'?to required type?'org.dao.EmpDaoMapper'?for?property 'empDao'; nested exception is java.lang.IllegalStateException: Cannot convert value of type?[org.mybatis.spring.mapper.MapperScannerConfigurer] to required type?[org.dao.EmpDaoMapper] for?property 'empDao': no matching editors or conversion strategy foundat org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:464)at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:495)at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:489)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1465)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1424)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1160)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)... 34 more Caused by: java.lang.IllegalStateException: Cannot convert value of type?[org.mybatis.spring.mapper.MapperScannerConfigurer] to required type?[org.dao.EmpDaoMapper] for?property 'empDao': no matching editors or conversion strategy foundat org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:267)at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:449)... 40 more下面是spring的所有配置文件信息:
配置數(shù)據(jù)源信息:
<!-- 配置數(shù)據(jù)源 --><bean?id="dataSource"?class="org.apache.commons.dbcp.BasicDataSource"><property?name="driverClassName"?value="com.mysql.jdbc.Driver"></property><property?name="url"?value="jdbc:mysql://localhost:3306/schooldb"></property><property?name="username"?value="root"></property><property?name="password"?value="root"></property></bean>配置SqlSessionFactory信息,以及加載數(shù)據(jù)源:
<!-- 加載數(shù)據(jù)源 --><bean?id="sqlSessionFactory"?class="org.mybatis.spring.SqlSessionFactoryBean"><property?name="dataSource"?ref="dataSource"></property><!-- 配置mapper屬性 --><property?name="mapperLocations"><list><value>classpath:org/dao/*/*.xml</value></list></property><!-- 配置mybatis配置文件 --><property?name="configLocation"?value="classpath:mybatis-config.xml"></property></bean>使用MapperScannerConfigurer注入映射器:
<!-- 使用MapperScannerConfigurer --><bean?id="empDao"?class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property?name="basePackage"?value="org.dao"></property></bean>下面就是配置Service層:
<bean id="empService"?class="org.service.impl.EmpServiceImpl"><property?name="empDao"?ref="empDao"></property></bean>問題就出在“配置Service層”這一步,原來在未使用MapperScannerConfigurer的時候,程序是可以正常跑起來的,但是加上MapperScannerConfigurer,程序就報(bào)錯,找了好半天,終于發(fā)現(xiàn),原來粗心的將對象名寫錯了,下面是問題的解決方式:
02
解決問題
更正MapperScannerConfigurer注入映射器和empService注入映射器,代碼如下:
<!-- 使用MapperScannerConfigurer --><bean??class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property?name="basePackage"?value="org.dao"></property></bean><bean?id="empService"?class="org.service.impl.EmpServiceImpl"><property?name="empDao"?ref="empDaoMapper"></property></bean>然后運(yùn)行項(xiàng)目,正常執(zhí)行:
03
分析問題
當(dāng)我們使用MapperScannerConfigurer注入映射器時,可以不用Mapper的實(shí)現(xiàn)類,但是Mapper的接口名必須要與所對應(yīng)的SQL映射文件名一模一樣,且接口中的方法名需與SQL映射文件的id名相同。
通過MapperScannerConfigurer可以批量生成映射器實(shí)現(xiàn),映射器被注冊到Spring的容器時,spring會自動根據(jù)其接口名給其命名,默認(rèn)規(guī)則是首字母小寫的非完全限定名。比如上面代碼中的接口名為EmpDaoMapper,那默認(rèn)命名就是empDaoMapper,原來在ref引入對象的時候,寫的是empDao,所以就報(bào)錯。改成其默認(rèn)的命名empDaoMapper問題解決。
希望大家在整合框架的時候,能認(rèn)真細(xì)心,避免出現(xiàn)沒必要的bug,耽誤時間。
辣椒醬,了解下唄~
往期精彩
考研生的努力程度是有多恐怖!
2020-12-27
越優(yōu)秀的人越努力,越努力的人越幸運(yùn)!
2020-12-26
“老師,為什么我一上課就感到困,聽課聽的總是走神?”
2020-12-25
最好的方法,是為你們量身定制!
2020-12-23
“桌面日歷”記錄的事件居然是看某某視頻……
2020-12-21
點(diǎn)分享
點(diǎn)點(diǎn)贊
點(diǎn)在看
總結(jié)
以上是生活随笔為你收集整理的mybatis和spring整合时这个报错,应该这样解决!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 360怎么查看电脑配置?
- 下一篇: 挺不喜欢下雪的