package com.starcharge.config; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * 配置redis序列化 * * @author Kevin Yu */ @Configuration @AutoConfigureAfter(RedisAutoConfiguration.class) public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory, RedisSerializer<Object> redisSerializer) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); //RedisTemplate对象需要指明Key序列化方式,如果声明StringRedisTemplate对象则不需要 template.setKeySerializer(StringRedisSerializer.UTF_8); template.setValueSerializer(redisSerializer); template.setHashKeySerializer(StringRedisSerializer.UTF_8); template.setHashValueSerializer(redisSerializer); //template.setEnableTransactionSupport(true);//是否启用事务 template.afterPropertiesSet(); return template; } /** * 自定义redis序列化的机制 * * @return */ @Bean public RedisSerializer<Object> redisSerializer() { ObjectMapper objectMapper = new ObjectMapper(); //反序列化时候遇到不匹配的属性并不抛出异常 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //序列化时候遇到空对象不抛出异常 objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); //反序列化的时候如果是无效子类型,不抛出异常 objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false); //指定DATE序列化格式,默认时间戳 objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); //不使用默认的dateTime进行序列化, objectMapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false); //使用JSR310提供的序列化类,里面包含了大量的JDK8时间序列化类 JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class,new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))); javaTimeModule.addDeserializer(LocalDateTime.class,new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))); objectMapper.registerModule(javaTimeModule); //指定序列化输入的类型@class JsonTypeInfo.As.PROPERTY-表示以对象属性的形式 WRAPPER_ARRAY-表示以数组的形式 objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); //配置null值的序列化器 GenericJackson2JsonRedisSerializer.registerNullValueSerializer(objectMapper, null); return new GenericJackson2JsonRedisSerializer(objectMapper); } public static void main(String[] args) { Map map = new HashMap<>(); map.put("id", 1); map.put("name", "Kevin"); map.put("adult", Boolean.TRUE); map.put("birthday", new Date()); map.put("createTime", LocalDateTime.now()); byte[] mapBytes=new RedisConfig().redisSerializer().serialize(map); System.out.println(new String(mapBytes)); System.out.println(((Map)new RedisConfig().redisSerializer().deserialize(mapBytes)).get("name")); } }