5

When I use Spring Data Redis to inject redisTemplate, the following error occurs:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redisTemplate' defined in com.worktime.configure.JpaConfigurationTest: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.springframework.core.serializer.support.DeserializingConverter.<init>(Ljava/lang/ClassLoader;)V
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:834)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:125)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:109)
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:261)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
... 25 more
Caused by: java.lang.NoSuchMethodError: org.springframework.core.serializer.support.DeserializingConverter.<init>(Ljava/lang/ClassLoader;)V
at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.<init>(JdkSerializationRedisSerializer.java:53)
at org.springframework.data.redis.core.RedisTemplate.afterPropertiesSet(RedisTemplate.java:117)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
... 40 more

Here is my code :

@Bean
public RedisConnectionFactory jedisConnectionFactory() {
    nodes = new ArrayList<String>();
    nodes.add("10.10.13.174:7001");
    nodes.add("10.10.13.174:7002");
    nodes.add("10.10.13.174:7003");
    RedisClusterConfiguration conf = new RedisClusterConfiguration(nodes);
    conf.setMaxRedirects(1000);
    JedisConnectionFactory factory = new JedisConnectionFactory(conf);

    return factory;
}

@Bean
RedisTemplate<Object, Object> redisTemplate() {
    RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
    redisTemplate.setConnectionFactory(jedisConnectionFactory());
    return redisTemplate;
}

My spring data redis version is 1.7.2, and redis version is 2.8.1.

abhi
  • 1,760
  • 1
  • 24
  • 40
web david
  • 61
  • 2
  • 5
  • 1
    Upgrade the Spring Core Framework to at least 4.2.1. Spring Data Redis uses a newer constructor, see [here](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/serializer/support/DeserializingConverter.html#DeserializingConverter-java.lang.ClassLoader-) – mp911de Aug 21 '16 at 14:37
  • I change to 4.3.2, it works well, thank you.^_^ – web david Aug 22 '16 at 02:13
  • @webdavid How to Configure the above as XML?, I'm having the same issue as described, Using Spring Data Redis 1.7.2.RELEASE and Spring 4.3.2. How to Configure RedisCacheManager for the same version? – nijogeorgep Sep 29 '16 at 07:24

2 Answers2

1

Use the below configuration to use with Spring Data Redis 1.7.2.RELEASE, This won't cause any injection issues.

    <cache:annotation-driven cache-manager="redisCacheManager" />

    <!-- Redis Connection Factory -->
    <beans:bean id="jedisConnectionFactory"
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
        p:host-name="${redis.host-name}" p:port="${redis.port}" p:use-pool="true" />

    <!-- Redis Template Definition -->
    <beans:bean id="redisTemplate"
        class="org.springframework.data.redis.core.RedisTemplate"
        p:connection-factory-ref="jedisConnectionFactory" p:keySerializer-ref="stringRedisSerializer"
        p:hashKeySerializer-ref="stringRedisSerializer" />

    <beans:bean id="stringRedisSerializer"
        class="org.springframework.data.redis.serializer.StringRedisSerializer" />

    <!-- declare Redis Cache Manager -->
    <beans:bean id='redisCacheManager'
        class='org.springframework.data.redis.cache.RedisCacheManager'
        c:redis-operations-ref='redisTemplate'>
    </beans:bean>
nijogeorgep
  • 762
  • 12
  • 20
1

I only need to change the Spring version into the project pom without change the bean definition.

<bean id="jedisConnectionFactoryStatic"     class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="hostName"   value="#{confMasterRedisStatic.host}" />
    <property name="port"       value="#{confMasterRedisStatic.port}" />
    <property name="usePool"    value="true" />
</bean>

<bean id="redisTemplateStatic" class="org.springframework.data.redis.core.StringRedisTemplate"
        p:connection-factory-ref="jedisConnectionFactoryStatic" />

pom.xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- <spring.version>3.0.7.RELEASE</spring.version> -->
    <spring.version>4.3.3.RELEASE</spring.version>
</properties>

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.7.4.RELEASE</version>
    <!-- <version>1.5.2.RELEASE</version> -->
</dependency>
cdesmetz
  • 2,378
  • 2
  • 14
  • 8