当前位置: 首页 > 知识库问答 >
问题:

为spring-boot redis缓存配置配置新的序列化程序

常英毅
2023-03-14

我一直在尝试更改spring-boot redis缓存的默认序列化程序,因为我想从默认实现更改为Jackson2Json实现之一。Jackson2Json库有两个实现,其中之一是:GenericJackson2JsonRedisSerializer,我可以在以下bean实例化中使用它:

@Bean
@Primary
public RedisCacheConfiguration defaultCacheConfig(ObjectMapper objectMapper) {

    return RedisCacheConfiguration.defaultCacheConfig()
        .serializeKeysWith(
            SerializationPair.fromSerializer(
                new StringRedisSerializer()
            )
        )
        .serializeValuesWith(
            SerializationPair.fromSerializer(
                new GenericJackson2JsonRedisSerializer(objectMapper)
            )
        )
        .prefixKeysWith("");
}

当我使用这个序列化器时,序列化工作正常,所有的东西都存储在redis服务器上,但是当o尝试反序列化存储在redis服务器上的JSON时,我收到以下异常

java.util.LinkedHashMap cannot be cast to tutorial.Person with root cause

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to tutorial.Person

缓存的使用方式如下:

@Cacheable(cacheNames = "person", key = "'person:'.concat(#post.id)")
public Person findPostAuthor(Post post){
}

序列化器不知道如何从LinkedHashMap转换到Person,我怎么告诉他怎么做呢?

我尝试使用的另一个序列化程序是Jackson2JsonRedisserializer:

@Bean
@Primary
public RedisCacheConfiguration defaultCacheConfig(ObjectMapper objectMapper) {
    Jackson2JsonRedisSerializer<Person> serializer = new Jackson2JsonRedisSerializer<>(Person.class);
    serializer.setObjectMapper(objectMapper);
    return RedisCacheConfiguration.defaultCacheConfig()
        .serializeKeysWith(
            SerializationPair.fromSerializer(
                new StringRedisSerializer()
            )
        )
        .serializeValuesWith(
            SerializationPair.fromSerializer(
                serializer
            )
        )
        .prefixKeysWith("");
}

当我直接在redis缓存中插入一个JSON时,我不能用这个序列化器反序列化它序列化器只是给我一个带有空name、email和id属性的Person对象。有办法解决吗?

如果有办法改进我的问题,请让我知道。

共有1个答案

涂浩皛
2023-03-14

genericjackson2jsonredisserializer假定Jackson的默认类型。当使用ObjectMapper实例创建GenericJackson2JsonRedisserializer时,请确保配置默认类型(EnableDefaultTyping(…))。

默认类型最适合于非final类型,并且需要在所有JSON负载中为该类型提供一致的属性名,以便Jackson能够识别要反序列化到的适当类型。

默认类型使用动态类型标记,如果您的数据源(Redis实例)不是完全可信的,那么这可能会成为一个安全问题。

jackson2jsonredisserializer固定到特定类型,并消除动态类型风险。

 类似资料:
  • 考虑以下服务,如何使用/actuator/refreshendpoint动态修改缓存配置 使用以下默认配置 假设设置为maximumsize=50,expireafteraccess=300s 在GreetingService中添加@refreshScope不起作用。不知何故,我需要指示Spring Boot重新创建CacheManager? null

  • 缓存的配置在configs/cache目录,目前支持三种缓存,文件缓存(FileCache), memcache缓存(MemoCache), redis缓存(RedisCache). 文件缓存的配置在file.config.php, 只有一个参数 "cache_dir", 表示文件缓存的根目录 memcache缓存配置在memo.config.php, 可以添加多个memcache服务器,配置格式

  • 本文将介绍如何使用Apache HTTP Server的缓存功能来加速Web和代理服务,同时避免常见问题和错误配置。 Apache HTTP服务器提供了一系列缓存功能,旨在以各种方式提高服务器的性能。 三态RFC2616 HTTP缓存 及其提供者模块提供智能的HTTP感知缓存。内容本身存储在缓存中,旨在遵守控制内容可缓存性的所有各种HTTP头和选项。针对简单和复杂的缓存配置,可以在其中处理代理内容

  • Nuxt.js 使用 lru-cache 提供组件缓存功能以获得更好的渲染性能。 使用方法 类型: Boolean 或 Object (默认值:false) 如果是一个对象类型,其配置属性可以参考 lru-cache 配置项。 例如 (nuxt.config.js): module.exports = { cache: true // or cache: { max: 1000

  • 我在Tomcat中部署了多个Web应用程序,并在TOMCAT_HOME/lib/exts中共享service jar。所有的应用程序都使用Spring,在服务罐中我有bean,用Spring 3.1缓存注释注释。我使用Ehache提供商。我想有一个单一的CacheManager使用的所有Web应用程序。如果我在Web应用程序级别定义Spring缓存配置,缓存工作,但为每个应用程序/上下文创建单独的

  • 我遇到了一个非常有趣的问题,试图让Jackson在自定义序列化程序类创建的JSON中正确删除空字段。我已经非常彻底地搜索了有关序列化程序和SerializationInclusion配置的信息,但我没有找到任何可以解释我所看到的内容的东西。 我配置了一个Jackson对象映射器,并通过Spring自动连接。对象映射器配置和POJO(为简洁起见进行了编辑)看起来或多或少像下面的代码。 出于某种原因,