前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot LocalDateTime序列化配置

SpringBoot LocalDateTime序列化配置

原创
作者头像
code-x
修改2022-08-17 14:57:32
1.3K0
修改2022-08-17 14:57:32
举报
文章被收录于专栏:code-xcode-x

项目中用LocalDateTime替换Date后, 许多地方需要增加配置

配置Json响应格式化方式

注册JavaTimeModule

代码语言:javascript
复制
/**
 * 序列化LocalDateTime
 */
@Bean
public JavaTimeModule javaTimeModule() {
    JavaTimeModule module = new JavaTimeModule();
    DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(pattern));
    module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(pattern));
    return module;
}
代码语言:javascript
复制
/**
 * 配置web序列化方式
 *
 * @param javaTimeModule javaTimeModule
 */
@Bean("objectMapperForWebMessageConverter")
@Primary
public ObjectMapper objectMapperForWebConvert(JavaTimeModule javaTimeModule) {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.registerModule(javaTimeModule);
    return objectMapper;
}

WebMvcConfig

代码语言:javascript
复制
@Configuration
@Slf4j
public class WebMvcConfig implements WebMvcConfigurer {

    private final ObjectMapper objectMapper;


    public WebMvcConfig(@Qualifier("objectMapperForWebMessageConverter") ObjectMapper diObjectMapper) {
        objectMapper = diObjectMapper;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

        converter.setObjectMapper(objectMapper);
        converters.add(0, stringHttpMessageConverter);
        converters.add(1, converter);
    }
}
配置Redis Value序列化方式

重新注册一个ObjectMapper

代码语言:javascript
复制
    @Bean("objectMapperForRedisSerializer")
    public ObjectMapper objectMapperForRedisSerializer(JavaTimeModule javaTimeModule) {
        var om = new ObjectMapper();
        om.registerModule(new SimpleModule().addSerializer(new NullValueSerializer(null)));
        om.registerModule(javaTimeModule);
        om.activateDefaultTyping(om.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.EVERYTHING,
                JsonTypeInfo.As.PROPERTY);
        return om;
    }
    
    static class NullValueSerializer extends StdSerializer<NullValue> {

        @Serial
        private static final long serialVersionUID = 1999052150548658808L;

        private final String classIdentifier;

        /**
         * @param classIdentifier can be {@literal null} and will be defaulted to {@code @class}.
         */
        NullValueSerializer(@Nullable String classIdentifier) {
            super(NullValue.class);
            this.classIdentifier = StringUtils.hasText(classIdentifier) ? classIdentifier : "@class";
        }

        @Override
        public void serialize(NullValue value, JsonGenerator jgen, SerializerProvider provider)
                throws IOException {
            jgen.writeStartObject();
            jgen.writeStringField(classIdentifier, NullValue.class.getName());
            jgen.writeEndObject();
        }

        @Override
        public void serializeWithType(NullValue value, JsonGenerator gen, SerializerProvider serializers,
                                      TypeSerializer typeSer) throws IOException {
            serialize(value, gen, serializers);
        }
    }
代码语言:javascript
复制
    @Bean("redisTemplateForObjectValue")
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory,
                                                       @Qualifier("objectMapperForRedisSerializer") ObjectMapper om) {
        var redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        //key序列化方式
        var stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);

        //value序列化方式
        var jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(om);

        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        redisTemplate.setEnableTransactionSupport(false);
        return redisTemplate;
    }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 配置Json响应格式化方式
  • 配置Redis Value序列化方式
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档