Spring data redis переопределяет сериализатор по умолчанию - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь создать компонент RedisTemplate, который будет иметь обновленный сериализатор значений для сериализации объекта в формате JSON в redis.

@Configuration
class RedisConfig {

  @Bean(name = ["redisTemplate"])
  @Primary
  fun template(factory: RedisConnectionFactory): RedisTemplate<Any, Any> {
    val template = RedisTemplate<Any, Any>()
    template.connectionFactory = factory
    template.valueSerializer = Jackson2JsonRedisSerializer(Object::class.java)
    template.afterPropertiesSet()
    return template
  }
}

Насколько я понимаю, Spring должен использоватьСериализатор JSON для сериализации объекта, возвращаемого методами, помеченными Cacheable аннотацией.Несмотря на эту конфигурацию, Spring, кажется, использует сериализатор Java по умолчанию, поскольку это исключение подтверждает этот факт.

java.io.NotSerializableException: en.prateekj.vds.dto.Task
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at java.util.ArrayList.writeObject(ArrayList.java:766)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1128)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at org.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:46)
at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:63)
at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:35)
at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:94)
at org.springframework.data.redis.serializer.DefaultRedisElementWriter.write(DefaultRedisElementWriter.java:43)
at org.springframework.data.redis.serializer.RedisSerializationContext$SerializationPair.write(RedisSerializationContext.java:219)
at org.springframework.data.redis.cache.RedisCache.serializeCacheValue(RedisCache.java:238)
at org.springframework.data.redis.cache.RedisCache.put(RedisCache.java:144)
at org.springframework.cache.interceptor.AbstractCacheInvoker.doPut(AbstractCacheInvoker.java:87)
at org.springframework.cache.interceptor.CacheAspectSupport$CachePutRequest.apply(CacheAspectSupport.java:770)
at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:398)
at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:314)
at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)

Я пропустил какую-либо конфигурацию или что-то, из-за чего Spring не может определить, что RedisTemplate использовать

1 Ответ

0 голосов
/ 24 октября 2018

Возможно, вы решили это пока что, но для дальнейших поисков ответа.

Согласно весенним данным redis ссылка :

По умолчанию RedisCache и RedisTemplate настроены на использование собственной сериализации Java.

Из стека трассировки я вижу, что вы на самом деле используете Redis для кэширования, поэтому вам нужно настроить RedisCache, а не RedisTemplate. RedisCache не принимает ваш @Bean, потому что он не использует RedisTemplate для внутреннего использования.

Пример того, как вы можете сделать это на Java:

    @EnableCaching
    @Configuration
    public class CacheConfig {

        @Bean
        @Primary
        public RedisCacheConfiguration defaultCacheConfig(ObjectMapper objectMapper) {
            return RedisCacheConfiguration.defaultCacheConfig()
                .serializeKeysWith(SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer(objectMapper)));
        }

    }
...