Redis序列化反序列化不一致 - String类型值多了双引号问题

转自c&0xff00 原文连接https://blog.csdn.net/weixin_37968613/article/details/117451614

问题背景:

A服务写入Redis的数据,B服务读出后,value值多了个双引号。如 “String” 获取到的是 ““String””。

问题原因:

A服务添加了一个redisTemplate Bean配置:

@Configuration

public class RedisTemplateConfig {

    @Bean(name = "redisTemplate")

    public RedisTemplate setRedisTemplate(RedisConnectionFactory redisConnectionFactory, RedisProperties redisProperties) {

        StringRedisTemplate template = new StringRedisTemplate(redisConnectionFactory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        redisProperties.setPassword(SecretKeyClient.getPassword(

                System.getProperty("datakeeper.application.redis.community.key_name")));

        ObjectMapper om = new ObjectMapper();

        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        jackson2JsonRedisSerializer.setObjectMapper(om);

        template.setValueSerializer(jackson2JsonRedisSerializer);

        template.setHashValueSerializer(jackson2JsonRedisSerializer);

        template.afterPropertiesSet();

        return template;

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

我们可以看到ValueSerializer用的是jackson2JsonRedisSerializer。

使用的时候通过@Resource注解引入:

    @Resource

    private RedisTemplate<String, String> redisTemplate;

1

2

@Resource默认就是通过beanName注入的,所以此时注入的RedisTemplate就是我们上面配置的。

在B服务中:

也配置了这样一个RedisTemplate:

@Configuration

public class RedisTemplateConfig {

    @Bean(name = "redisTemplate")

    public RedisTemplate setRedisTemplate(RedisConnectionFactory redisConnectionFactory, RedisProperties redisProperties) {

        StringRedisTemplate template = new StringRedisTemplate(redisConnectionFactory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        redisProperties.setPassword(SecretKeyClient.getPassword(

                System.getProperty("datakeeper.application.redis.community.key_name")));

        ObjectMapper om = new ObjectMapper();

        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        jackson2JsonRedisSerializer.setObjectMapper(om);

        template.setValueSerializer(jackson2JsonRedisSerializer);

        template.setHashValueSerializer(jackson2JsonRedisSerializer);

        template.afterPropertiesSet();

        return template;

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

配置和A服务一模一样。

但是,在使用RedisTemplate时采用的@Autowired注解:

    @Autowired

    private RedisTemplate<String, String> redisTemplate;

1

2

我们知道@Autowired注解默认是按照BeanClass即BeanType进行注入的,此时注入的RedisTemplate却不是我们上面配置的,而是SpringBoot自动配置的。

在RedisAutoConfiguration中:

@Bean

@ConditionalOnMissingBean(name = "redisTemplate")

public RedisTemplate<Object, Object> redisTemplate(

RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {

RedisTemplate<Object, Object> template = new RedisTemplate<>();

template.setConnectionFactory(redisConnectionFactory);

return template;

}

1

2

3

4

5

6

7

8

我们看到,我们配置的与SpringBoot默认的redisTemplate不相同。

通过打断点进行对比:

SpringBoot默认的:

我们自己定义的:

可以看到,在valueSerializer上,一个是StringRedisSerializer,一个是Jackson2JsonRedisSerializer。

所以,在序列化与反序列化的方式不同时,产生这种乱码,奇怪的双引号问题也就可以解释了。

解决方案

将序列化反序列化方式改成一致。

————————————————

版权声明:本文为CSDN博主「c&amp;0xff00」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_37968613/article/details/117451614

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容