Redis序列化反序列化不一致 - String類型值多了雙引號問題

轉(zhuǎn)自c&0xff00?原文連接https://blog.csdn.net/weixin_37968613/article/details/117451614

問題背景:

A服務(wù)寫入Redis的數(shù)據(jù),B服務(wù)讀出后,value值多了個雙引號。如 “String” 獲取到的是 ““String””。

問題原因:

A服務(wù)添加了一個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默認(rèn)就是通過beanName注入的,所以此時注入的RedisTemplate就是我們上面配置的。

在B服務(wù)中:

也配置了這樣一個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服務(wù)一模一樣。

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

? ? @Autowired

? ? private RedisTemplate<String, String> redisTemplate;

1

2

我們知道@Autowired注解默認(rèn)是按照BeanClass即BeanType進(jìn)行注入的,此時注入的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默認(rèn)的redisTemplate不相同。

通過打斷點進(jìn)行對比:

SpringBoot默認(rèn)的:

我們自己定義的:

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

所以,在序列化與反序列化的方式不同時,產(chǎn)生這種亂碼,奇怪的雙引號問題也就可以解釋了。

解決方案

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

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

版權(quán)聲明:本文為CSDN博主「c&amp;0xff00」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容