首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring数据编辑覆盖默认序列化程序。

Spring数据编辑覆盖默认序列化程序。
EN

Stack Overflow用户
提问于 2018-05-10 11:41:35
回答 1查看 12.3K关注 0票数 7

我正在尝试创建一个RedisTemplate bean,它将具有更新的值序列化程序,以以redis格式序列化一个JSON格式的对象。

代码语言:javascript
运行
复制
@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序列化程序,因为此异常证实了这一事实。

代码语言:javascript
运行
复制
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的东西?

EN

回答 1

Stack Overflow用户

发布于 2018-10-24 14:20:10

你可能已经解决了它的同时,但为进一步的答案寻求者。

根据春季数据红皮书参考文献

默认情况下,RedisCache和RedisTemplate配置为使用本机序列化。

从堆栈跟踪中,我可以看到您实际上是在使用Redis进行缓存,因此您需要配置RedisCache而不是RedisTemplateRedisCache没有拿起您的@Bean,因为它没有在内部使用RedisTemplate

例如,如何在Java中这样做:

代码语言:javascript
运行
复制
    @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)));
        }

    }
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50272157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档