4

我们正在使用Spring Cache Managerwith spring-data-redis 1.5.2。这些天我们想升级spring-data-redis到最新版本,即:1.6.2.RELEASE。

由于一些奇怪的原因,一切都很好,1.5.2但是当升级到1.6.2我们得到

org.springframework.beans.factory.UnsatisfiedDependencyException:在 ServletContext 资源 [/WEB-INF/spring-cache.xml] 中定义名称为“cacheManager”的 bean 创建错误:通过构造函数参数表示的不满足的依赖关系,索引为 0 类型 [org.springframework .data.redis.core.RedisOperations]:不明确的构造函数参数类型 - 您是否将正确的 bean 引用指定为构造函数参数?

此消息似乎是一个错误,因为redisTemplateRedisTemplate实现了RedisOperations.

知道如何解决吗?

附言

请注意,删除版本cache configuration1.6.2似乎效果很好。所以问题出在缓存上。

配置

web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    /WEB-INF/spring-redis.xml
    /WEB-INF/spring-cache.xml 
    </param-value>
</context-param>

spring-redis.xml

<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>

弹簧缓存.xml

<!-- 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>
4

3 回答 3

3

似乎这个错误的原因是RedisCacheManager有两个constructors. 它们都有RedisOperationsas 参数。由于某种原因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>
于 2015-12-28T12:22:38.717 回答
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>
于 2016-09-29T12:21:42.270 回答
1

这是一个老问题,但对于那些到达此页面的人来说。

<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" />

于 2020-01-08T12:55:47.577 回答