我们将Spring Cache Manager
与spring-data-redis
1.5.2
一起使用。这些天我们想要将spring-data-redis
升级到最新版本,即:1.6.2.RELEASE。
出于某些奇怪的原因,1.5.2
一切正常,但升级到1.6.2
时我们得到了
org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名称为' cacheManager'的bean时出错在ServletContext中定义 资源[/WEB-INF/spring-cache.xml]:不满意的依赖项 通过类型为索引0的构造函数参数表示 [org.springframework.data.redis.core.RedisOperations]:不明确 构造函数参数类型 - 您是否指定了正确的bean 引用作为构造函数参数?
此消息似乎是一个错误,因为redisTemplate
RedisTemplate
实现了RedisOperations
。
知道怎么解决吗?
请注意,删除cache configuration
时,1.6.2
版本似乎运行良好。所以问题在于缓存。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring-redis.xml
/WEB-INF/spring-cache.xml
</param-value>
</context-param>
<context:annotation-config />
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" />
<bean
class="org.springframework.security.web.session.HttpSessionEventPublisher" />
<!-- end of seesion managment configuration -->
<bean id="redisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="port" value="${app.redis.port}" />
<property name="hostName" value="${app.redis.hostname}" />
<property name="password" value="${app.redis.password}" />
<property name="usePool" value="true" />
</bean>
<!-- for publishing string over redis channels -->
<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="redisConnectionFactory" />
</bean>
<!-- for storing object into redis key,value -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="redisConnectionFactory" />
</bean>
<!-- This file must load after spring-redis.xml -->
<cache:annotation-driven />
<!-- declare Redis Cache Manager -->
<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"
c:template-ref="redisTemplate" />
</beans>
答案 0 :(得分:3)
这个错误的原因似乎是constructors
有两个RedisOperations
。它们都有Spring
作为参数。有理由first constructor
无法理解它与constructor-arg
有关,而与第二个无关。提及工作index
<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
<constructor-arg index="0" ref="redisTemplate"></constructor-arg>
</bean>
[error] (spark-cassandra-connector-java/*:assembly) deduplicate: different file contents found in the following:
[error] /home/user/.ivy2/cache/io.netty/netty/bundles/netty-3.8.0.Final.jar:org/jboss/netty/bootstrap/Bootstrap.class
[error] /home/user/.ivy2/cache/org.jboss.netty/netty/bundles/netty-3.2.2.Final.jar:org/jboss/netty/bootstrap/Bootstrap.class
答案 1 :(得分:1)
从Spring Data Redis 1.5.2.RELEASE升级到1.6.2.RELEASE时,我们需要将以下配置用于RedisCacheManager。以前的版本使用 redis-template-ref 而不是 redis-operations-ref 。
<beans:bean id='cacheManager'
class='org.springframework.data.redis.cache.RedisCacheManager'
c:redis-operations-ref='redisTemplate'>
</beans:bean>
答案 2 :(得分:0)
这是一个古老的问题,但对于那些访问此页面的人来说。
<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager" factory-method="create" c:connection-factory-ref="jedisConnectionFactory" p:transaction-aware="true" />
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnectionFactory" />
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${cache.redis.host}" p:port="${cache.redis.port}" p:use-pool="true">
<constructor-arg ref="jedisPoolConfig"></constructor-arg>
</bean>
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" p:maxTotal="${cache.redis.pool.maxTotal}" p:maxIdle="${cache.redis.pool.maxIdle}" p:maxWaitMillis="${cache.redis.pool.maxWaitMillis}" p:testOnBorrow="true" />