SpringBoot中Redis连接池存储对象出现乱码问题的解决教程:Could not read JSON: Unexpected character (�) at position 0.

文章介绍了在SpringBoot使用Redis时遇到的对象存储乱码问题,问题源于默认的JdkSerializationRedisSerializer序列化方式。解决方案包括更换序列化器为StringRedisSerializer和GenericJackson2JsonRedisSerializer,或直接将对象转换为JSON格式存储和读取。

前言

  SpringBoot是一个非常方便的Java开发框架,但在实际开发过程中,我们难免会遇到一些问题。这里将介绍在使用SpringBoot时,当我们将对象存储到Redis中时,出现了乱码的问题,并将会给出详细的解决方案。

问题背景

  在使用SpringBoot连接Redis的时候,我们通常会选择使用RedisTemplate来进行操作。但是,在使用RedisTemplate将一个类存储到Redis中时,有时候会出现乱码的情况,如下所示:

org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Unexpected character (�) at position 0.

  这个错误提示告诉我们,RedisTemplate无法解析JSON格式的对象,并且在第一个字符位置处出现了意外的字符(即乱码)。

问题分析

  经过仔细查找,我们发现这个问题的原因是RedisTemplate默认使用JdkSerializationRedisSerializer进行序列化,而JdkSerializationRedisSerializer会将对象序列化成字节流,导致我们在取出数据后无法正常解析。

解决方案

方案一:更换序列化器

  为了解决这个问题,我们可以更换RedisTemplate的序列化器。在SpringBoot中,我们可以通过修改application.yml文件来进行配置:

spring:
  redis:
    host: localhost
    port: 6379
    password:
    timeout: 10000
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        max-wait: -1
        min-idle: 0
      shutdown-timeout: 3000
    # 更换序列化器
    keySerializer: org.springframework.data.redis.serializer.StringRedisSerializer
    valueSerializer: org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer

  这里我们将keySerializer和valueSerializer都更换为了StringRedisSerializer和GenericJackson2JsonRedisSerializer。

方案二:修改存储方式

  除了更换序列化器的方式外,我们也可以选择修改存储的方式。例如,不直接将对象存储到Redis中,而是将其转换成JSON格式再存储。示例代码如下:

@Autowired
private RedisTemplate redisTemplate;

public void setObject(String key, Object value) {
    // 将对象转换成JSON字符串
    String jsonString = JSON.toJSONString(value);
    redisTemplate.opsForValue().set(key, jsonString);
}
    
public Object getObject(String key) {
    String value = (String) redisTemplate.opsForValue().get(key);
    // 将JSON字符串转换成对象
    return JSON.parseObject(value, Object.class);
}

  这样,我们就可以正确地将对象存储到Redis中,并且在需要的时候顺利地取出。

结束语

  以上就是本次关于SpringBoot中Redis连接池存储对象出现乱码问题的解决教程,希望能够对您在实际开发中遇到类似问题时有所帮助。

### 解决 Spring Data Redis 反序列化 JSON 时遇到意外令牌 `START_OBJECT` 的方法 当处理来自Redis的消息并尝试将其反序列化为Java对象时,如果配置不当可能会抛出异常。具体来说,在期望数组的情况下接收到对象会引发`SerializationException`。 为了防止这种情况发生,可以采取以下措施: #### 修改消息结构以匹配预期的数据类型 确保发布到频道的消息格式与订阅者所期待的一致。如果是列表或集合,则应发送JSON数组而不是单个对象[^2]。 ```json [ { "key": "value" } ] ``` 而非: ```json { "key": "value" } ``` #### 自定义序列化器/反序列化器 创建自定义的序列化程序来控制如何将数据存储至缓存以及从中检索的方式。这允许更灵活地管理不同类型之间的转换过程。 对于Jackson库而言,可以通过设置ObjectMapper实例中的特性来调整其行为模式,从而更好地适应特定的应用场景需求。 ```java import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; @Bean public StringRedisTemplate template(RedisConnectionFactory connectionFactory) { final var template = new StringRedisTemplate(connectionFactory); Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper mapper = new ObjectMapper(); // 配置ObjectMapper... serializer.setObjectMapper(mapper); template.setValueSerializer(serializer); template.afterPropertiesSet(); return template; } ``` 通过上述方式能够有效避免因不兼容的对象形式而导致解析失败的情况出现。 另外值得注意的是,在某些情况下可能是因为第三方依赖版本差异引起的问题;因此建议检查项目中使用的各个组件及其相互间的协作关系是否存在问题,并考虑升级相关软件包到最新稳定版以便获得更好的支持和服务质量改进[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值