版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xing930408/article/details/88075986
在一个springmvc(spring是3.0版本,其对应的thyemleaf也应该是spring3的版本)项目中添加thyemleaf时候,出现这个错误,
Cannot convert value of type [org.apache.shiro.cache.ehcache.EhCacheManager] to required type [org.thymeleaf.cache.ICacheManager] for property 'cacheManager': no matching editors or conversion strategy found
初看这个错误,从字面意思来看,感觉是对于cacheManager这个属性,没法将[org.apache.shiro.cache.ehcache.EhCacheManager]转换成[org.thymeleaf.cache.ICacheManager] for property 'cacheManager',
于是查看配置文件,发现cacheManager这个属性只有在配置shrio时候用到了
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="sessionManager" ref="sessionManager"/>
<property name="authenticator" ref="authenticator"/>
<property name="cacheManager" ref="cacheManager"/>
<property name="realms">
<array>
<ref bean="ticketRealm"/>
</array>
</property>
</bean>
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:com/jdjr/ft/sso/api/ehcache/ehcache.xml"/>
</bean>
所以我猜测应该是thyemleaf中有个属性也叫cacheManager,由于在这里注册了bean,所以这个属性先去spring容器里面拿来用了,于是百度,终于找到了这篇文章https://blog.csdn.net/baokx/article/details/50470908,按照博主给的参考,给出了解决方法1,即直接把cacheManager拿到securityManager内部来,发现项目正常启动
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="sessionManager" ref="sessionManager"/>
<property name="authenticator" ref="authenticator"/>
<property name="cacheManager">
<bean class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:com/jdjr/ft/sso/api/ehcache/ehcache.xml"/>
</bean>
</property>
<property name="realms">
<array>
<ref bean="ticketRealm"/>
</array>
</property>
</bean>
同时又在思考,之所以产生这个错误,是因为了引用了同一个bean,所以如果把bean的id改一下是否可以呢?经过验证确实可以,解决方法2
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="sessionManager" ref="sessionManager"/>
<property name="authenticator" ref="authenticator"/>
<property name="cacheManager" ref="cacheManager1"/>
<property name="realms">
<array>
<ref bean="ticketRealm"/>
</array>
</property>
</bean>
<bean id="cacheManager1" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpa
完整错误如下
java.lang.IllegalStateException: Cannot convert value of type [org.apache.shiro.cache.ehcache.EhCacheManager] to required type [org.thymeleaf.cache.ICacheManager] for property 'cacheManager': no matching editors or conversion strategy found
org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:241)
org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:470)
org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:516)
org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:510)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1406)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1365)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1360)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:400)
org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1164)
org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:275)
org.springframework.web.servlet.DispatcherServlet.initViewResolvers(DispatcherServlet.java:665)
org.springframework.web.servlet.DispatcherServlet.initStrategies(DispatcherServlet.java:445)
org.springframework.web.servlet.DispatcherServlet.onRefresh(DispatcherServlet.java:430)
org.springframework.web.servlet.FrameworkServlet.onApplicationEvent(FrameworkServlet.java:752)
org.springframework.web.servlet.FrameworkServlet$ContextRefreshListener.onApplicationEvent(FrameworkServlet.java:989)
org.springframework.web.servlet.FrameworkServlet$ContextRefreshListener.onApplicationEvent(FrameworkServlet.java:1)
org.springframework.context.event.GenericApplicationListenerAdapter.onApplicationEvent(GenericApplicationListenerAdapter.java:51)
org.springframework.context.event.SourceFilteringListener.onApplicationEventInternal(SourceFilteringListener.java:97)
org.springframework.context.event.SourceFilteringListener.onApplicationEvent(SourceFilteringListener.java:68)
org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:97)
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:324)
org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:929)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:467)
org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645)
org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508)
org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
javax.servlet.GenericServlet.init(GenericServlet.java:158)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2527)
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2516)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:748)