При использовании RedisTemplate Spring для получения данных из Redis в проекте я обнаружил, что значение строки имеет больше двойных кавычек. Как показано ниже:
Причины можно разделить на несколько аспектов:
1. Используются разные объекты сериализации.
При вызове между несколькими службами метод сериализации, используемый службой сериализации A (запись данных в Redis) и службой десериализации B (чтение данных из Redis), различается.
Например, служба сериализации A использует метод Jackson2JsonRedisSerializer.
Служба десериализации B использует метод FastJson2JsonRedisSerializer.
Различные методы сериализации двух служб могут привести к несогласованности считываемых данных.
Для этой ситуации метод сериализации можно унифицировать. То есть использование того же метода сериализации может решить эту проблему.
2. Вызвано @Autowired и @Resource.
Давайте сначала рассмотрим разницу между @Autowired и @Resource Spring.
①: @Resource по умолчанию вводится через beanName.
②: Аннотация @Autowired по умолчанию вводится в соответствии с BeanClass или BeanType.
Описание сцены: Запись в Redis и чтение Redis — это одна и та же служба. Тогда метод сериализации, конечно же, тот же. Но почему при чтении возникает проблема дополнительных двойных кавычек?
Давайте сначала посмотрим на запись данных в Redis.
Вы можете видеть, что используется аннотация @Autowired.
Мы знаем, что аннотация @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;
}
Мы видим, что то, что мы настроили, отличается от стандартного redisTemplate SpringBoot.
Сравните по переломным моментам: SpringBoot по умолчанию:
Наше собственное определение:
Как видите, в valueSerializer один — StringRedisSerializer, а другой — Jackson2JsonRedisSerializer.
Следовательно, когда методы сериализации и десериализации различны, генерируется такой искаженный код, и можно объяснить странную проблему двойных кавычек.
решение
Измените метод сериализации и десериализации, чтобы он был согласованным.
Опубликуйте конфигурацию сериализации здесь:
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// Ключ использует сериализацию строк.
template.setKeySerializer(stringRedisSerializer);
// Хэш-ключ также использует сериализацию строк.
template.setHashKeySerializer(stringRedisSerializer);
// сериализация значений Возможность использования Джексона
template.setValueSerializer(stringRedisSerializer);
// hashизсериализация значений Возможность использования Джексона
template.setHashValueSerializer(stringRedisSerializer);
template.afterPropertiesSet();
return template;
}