RedisConfig.java 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package com.example.course.config;
  2. import com.fasterxml.jackson.annotation.JsonTypeInfo;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.fasterxml.jackson.databind.SerializationFeature;
  5. import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.data.redis.connection.RedisConnectionFactory;
  8. import org.springframework.data.redis.core.RedisTemplate;
  9. import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
  10. import org.springframework.data.redis.serializer.StringRedisSerializer;
  11. import org.springframework.stereotype.Component;
  12. import java.text.SimpleDateFormat;
  13. @Component
  14. public class RedisConfig {
  15. @Bean
  16. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
  17. RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
  18. redisTemplate.setConnectionFactory(connectionFactory);
  19. // Key/HashKey 使用字符串序列化
  20. StringRedisSerializer stringSerializer = new StringRedisSerializer();
  21. redisTemplate.setKeySerializer(stringSerializer);
  22. redisTemplate.setHashKeySerializer(stringSerializer);
  23. // Value/HashValue 使用 JSON 序列化(带类型信息)
  24. GenericJackson2JsonRedisSerializer jsonSerializer = createJsonSerializer();
  25. redisTemplate.setValueSerializer(jsonSerializer);
  26. redisTemplate.setHashValueSerializer(jsonSerializer);
  27. redisTemplate.afterPropertiesSet();
  28. return redisTemplate;
  29. }
  30. /**
  31. * 创建支持类型信息的 JSON 序列化器
  32. */
  33. private GenericJackson2JsonRedisSerializer createJsonSerializer() {
  34. ObjectMapper objectMapper = new ObjectMapper();
  35. // 启用默认类型信息(解决嵌套对象反序列化问题)
  36. objectMapper.activateDefaultTyping(
  37. objectMapper.getPolymorphicTypeValidator(),
  38. ObjectMapper.DefaultTyping.NON_FINAL,
  39. JsonTypeInfo.As.PROPERTY
  40. );
  41. // 配置日期格式(根据实际需求调整)
  42. objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
  43. objectMapper.registerModule(new JavaTimeModule());
  44. objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
  45. return new GenericJackson2JsonRedisSerializer(objectMapper);
  46. }
  47. }