SpringBoot-自定义解决Redis序列化问题(包含自定义时间序列化方式)

此自定义方式解决了取出来的value值都是linkedhashmap问题。

import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.joda.time.DateTime;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.stereotype.Component;
/**
 * @Created with IntelliJ IDEA
 * @Description:
 * @author: FLy-Fly-Zhang
 */


@Component
@EnableRedisHttpSession(maxInactiveIntervalInSeconds=3600) //为SpringSession的过期时间(单位:秒)
public class RedisConfig {
    /**
     * 定制化redis配置
     * 当此bean加载时RedisAutoConfiguration 类中public RedisTemplate<Object, Object> redisTemplate 不在加载
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate redisTemplate=new RedisTemplate();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //改变key的序列化方式
        StringRedisSerializer stringRedisSerializer=new StringRedisSerializer(); //使用String的序列化方式
        redisTemplate.setKeySerializer(stringRedisSerializer);
        //改变value的序列化方式
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper=new ObjectMapper(); //注册使用
 //最开始没有这行代码,一直报linkedhashmap错误,最后发现若objectMapper没有配置默认的type
 //那么json就只会使用简单的数据绑定java类型,其中object就会在反序列化时变成linkedhashmap      objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL,JsonTypeInfo.As.PROPERTY);
        SimpleModule simpleModule=new SimpleModule();
        simpleModule.addSerializer(DateTime.class,new JodaDateTimeJsonSerializer());
        simpleModule.addDeserializer(DateTime.class,new JodaDateTimeJsonDeserializer());
        objectMapper.registerModule(simpleModule);

        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        return redisTemplate;
    }

}
class JodaDateTimeJsonDeserializer extends JsonDeserializer<DateTime> {
    @Override
    public DateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        String date=p.readValueAs(String.class); //将对应序列化的时间转换为字符串
        DateTimeFormatter formatter= DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); //时间格式
        return DateTime.parse(date,formatter);
    }
}
class JodaDateTimeJsonSerializer extends JsonSerializer<DateTime> {

    @Override
    public void serialize(DateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(value.toString("yyyy-MM-dd HH:mm:ss"));
    }
}

发布了354 篇原创文章 · 获赞 280 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Fly_Fly_Zhang/article/details/98852516