如何解决LocalDateTime传值JSON格式化问题

 更新时间:2022年08月27日 10:30:41   作者:达希_  
这篇文章主要介绍了如何解决LocalDateTime传值JSON格式化问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

LocalDateTime传值JSON格式化问题

LocalDateTime是JDK8中提供的新功能,极大的优化了原生日期时间类的使用。

但是第一次使用该类可能会在传值过程中出现格式化的小问题(如:JSON无法解析前端所传格式,序列化时LocalDateTime成为数组等),以下提供简单的解决方案。

推荐方法

在WebMvcConfigurer实现类下完成以下两步

1).注册一个Converter<String, LocalDateTime>实现类,其作用是处理于url所携带的参数上(如:@RequestParam、@PathVariable )的LocalDateTime参数;

2).增加一个序列化、反序列化器,作用为处理实体类的的LocalDateTime属性。

P.S.经过多轮测试,得出了以上方法,由于该方法需要以上两个步骤,作为完美主义者,我曾尝试用一个步骤解决,但并未如愿以偿,若你有更好的方法,还望不吝赐教,先行谢过。

源码如下:

// import ...
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
    
    /**
     * 自定义String转LocalDateTime方法,此方法将会作用于url所携带的参数上
     */
    static class StringToLocalDateTimeConverter implements Converter<String, LocalDateTime> {
        @Override
        public LocalDateTime convert(String s) {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            return LocalDateTime.parse(s, formatter);
        }
    }
    /**
     * 将上述自定义方法进行添加
     */
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToLocalDateTimeConverter());
    }
    
    /**
     * 增加序列化与反序列化器,它们将作用于实体类的LocalDateTime属性。
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        ObjectMapper objectMapper = new ObjectMapper();
        JavaTimeModule module = new JavaTimeModule();
        module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(pattern));
        module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(pattern));
        objectMapper.registerModule(module);
        converters.add(new MappingJackson2HttpMessageConverter(objectMapper));
    }
}

其它方法

url参数:

给参数加上@DateTimeFormat(此注解来自Spring,无需引入其他包),在pattern中标注约定好的格式即可。

public void Test(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime time) {
    ...
}

实体类:

在实体类中的属性上添加@JsonFormat(此注解来自Jackson,该包被Spring所依赖,无需导入),同样在pattern中标注好格式。

@Data
public class Demo {
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime time;
    
}

由于这种方法需要对代码中所有的LocalDateTime都进行标注,相对麻烦,且耦合度高,所以不作推荐。

LocalDateTime的json格式化问题

LocalDateTime 的 json 格式化存在问题如图所示:

解决方式一

添加json格式化配置文件:

@Configuration
public class LocalDateTimeSerializerConfig {
    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
    private String pattern;
    public LocalDateTimeSerializer localDateTimeDeserializer() {
        return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
    }
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());
    }
}

解决方式二

@JsonFormat 注解

上面的方案全局生效,当全局的格式化方式无法满足我们需求时,我们对日期格式要做特殊的处理:在类的属性上添加注解

@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;

加上效果后:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • springboot文件上传保存路径的问题

    springboot文件上传保存路径的问题

    这篇文章主要介绍了springboot文件上传保存路径的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java行为型模式中命令模式分析

    Java行为型模式中命令模式分析

    在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时可以使用命令模式来进行设计
    2023-02-02
  • Java实现验证码的产生和验证

    Java实现验证码的产生和验证

    这篇文章主要为大家详细介绍了Java实现验证码的产生和验证,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2012-01-01
  • Java Structs框架原理案例详解

    Java Structs框架原理案例详解

    这篇文章主要介绍了Java Structs框架原理案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • java连接数据库知识点总结以及操作应用

    java连接数据库知识点总结以及操作应用

    这篇文章主要给大家介绍了关于java连接数据库知识点总结以及操作应用的相关资料, 当涉及到Java中数据库数据处理时,我们可以利用强大的Java数据库连接技术与各种数据库进行交互,需要的朋友可以参考下
    2023-12-12
  • Spring Web项目spring配置文件随服务器启动时自动加载

    Spring Web项目spring配置文件随服务器启动时自动加载

    这篇文章主要介绍了Spring Web项目spring配置文件随服务器启动时自动加载,加载spring的配置文件,并且只加载一次,从而提高程序效率。具体内容详情大家通过本文一起学习吧
    2018-01-01
  • sharding-jdbc5.0.0实现分表实践

    sharding-jdbc5.0.0实现分表实践

    本文主要介绍了sharding-jdbc5.0.0分表实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 详解Java中的封装、继承、多态

    详解Java中的封装、继承、多态

    本文主要介绍了Java中的封装、继承、多态的相关知识,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 全面解析JPA 仓库repository中的findAll()方法

    全面解析JPA 仓库repository中的findAll()方法

    这篇文章主要介绍了全面解析JPA 仓库repository中的findAll()方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java实现TCP/IP协议的收发数据(服务端)代码实例

    Java实现TCP/IP协议的收发数据(服务端)代码实例

    这篇文章主要介绍了Java实现TCP/IP协议的收发数据(服务端)代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论