解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理

发布时间 - 2026-01-10 22:59:34    点击率:

有时在Spring MVC中返回JSON格式的response的时候会使用@ResponseBody注解,不过在处理java8中时间的时候会很麻烦,一般我们使用的HTTPMessageConverter是MappingJackson2HttpMessageConverter,它默认返回的时间格式是这种:

"startDate" : {
  "year" : 2010,
  "month" : "JANUARY",
  "dayOfMonth" : 1,
  "dayOfWeek" : "FRIDAY",
  "dayOfYear" : 1,
  "monthValue" : 1,
  "hour" : 2,
  "minute" : 2,
  "second" : 0,
  "nano" : 0,
  "chronology" : {
   "id" : "ISO",
   "calendarType" : "iso8601"
  }
 }

但是我们不会返回这种给前端使用,针对LocalDate想要返回的格式是2016-11-26,而LocalDateTime想要返回的格式是2016-11-26 21:04:34这样的数据。通过项目研究并查阅相关资料,这里介绍下个人研究中实现的两种方式。

解决方法一:

若是maven项目,在pom中引入下面的jar包:

<dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jsr310</artifactId>
   <version>2.8.5</version>
 </dependency>

然后在你想要JSON化的POJO字段的get函数上加上一个@JsonSerializer注解,如下

import com.fasterxml.jackson.annotation.JsonFormat;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
public LocalDateTime getBirthday() {
    return this.loginTime;
  }

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
public LocalDateTime getLastLoginTime() {
    return this.loginTime;
  }

这种方式的优点是可以针对具体域类型设置不同显示方式,然而优点也是缺点,因为每个日期属性都要手动添加,实际中日期属性又是普遍必备,并且需要额外引入jsr310的jar包。

解决方法二:

继承ObjectMapper来实现返回json字符串。MappingJackson2HttpMessageConverter主要通过ObjectMapper来实现返回json字符串。这里我们编写一个JsonUtil类,获取ObjectMapper以针对java8中新的日期时间API,注册相应的JsonSerializer<T>。

/**
 * json处理工具类
 * 
 * 
 */
@Component
public class JsonUtil {

  private static final ObjectMapper mapper;

  public ObjectMapper getMapper() {
    return mapper;
  }

  static {

    mapper = new ObjectMapper();

    SimpleModule module = new SimpleModule();
    module.addSerializer(LocalDate.class, new LocalDateSerializer());
    module.addSerializer(LocalTime.class, new LocalTimeSerializer());
    module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
    mapper.registerModule(module);
  }

  public static String toJson(Object obj) {
    try {
      return mapper.writeValueAsString(obj);
    } catch (Exception e) {
      throw new RuntimeException("转换json字符失败!");
    }
  }

  public <T> T toObject(String json, Class<T> clazz) {
    try {
      return mapper.readValue(json, clazz);
    } catch (IOException e) {
      throw new RuntimeException("将json字符转换为对象时失败!");
    }
  }
}

class LocalDateSerializer extends JsonSerializer<LocalDate> {

  private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

  @Override
  public void serialize(LocalDate value, JsonGenerator jgen, SerializerProvider provider)
      throws IOException, JsonProcessingException {
    jgen.writeString(dateFormatter.format(value));
  }
}

class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {

  private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

  @Override
  public void serialize(LocalDateTime value, JsonGenerator jgen, SerializerProvider provider)
      throws IOException, JsonProcessingException {
    jgen.writeString(dateTimeFormatter.format(value));
  }

}

class LocalTimeSerializer extends JsonSerializer<LocalTime> {

  private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");

  @Override
  public void serialize(LocalTime value, JsonGenerator jgen, SerializerProvider provider)
      throws IOException, JsonProcessingException {
    jgen.writeString(timeFormatter.format(value));

  }

}

然后在springmvc的配置文件中,再将<mvc:annotation-driven/>改为以下配置,配置一个新的json转换器,将它的ObjectMapper对象设置为JsonUtil中的objectMapper对象,此转换器比spring内置的json转换器优先级更高,所以与json有关的转换,spring会优先使用它。

<mvc:annotation-driven>
    <mvc:message-converters>
      <bean
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="objectMapper" value="#{jsonUtil.mapper}" />
        <property name="supportedMediaTypes">
          <list>
            <value>application/json;charset=UTF-8</value>
          </list>
        </property>
      </bean>
    </mvc:message-converters>
  </mvc:annotation-driven>

然后java8中的几种日期和时间类型就可以正常友好的显示了。优点是全局统一管理日期和时间等类型,缺点对pojo中的某个域做特殊处理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# spring  # mvc日期格式化  # springmvc  # 时间格式化  # json  # date  # SpringBoot利用jackson格式化时间的三种方法  # springboot2.0 配置时间格式化不生效问题的解决  # 关于Springboot日期时间格式化处理方式总结  # springboot json时间格式化处理的方法  # springmvc fastjson 反序列化时间格式化方法(推荐)  # spring中时间格式化的两种方法示例讲解  # 来实现  # 解决方法  # 又是  # 都要  # 两种  # 更高  # 几种  # 相关资料  # 会很  # 设置为  # 转换为  # 再将  # 你想要  # 配置文件  # 大家多多  # 上加  # 就可以  # 中新  # 使用它  # fasterxml 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: javascript中的try catch异常捕获机制用法分析  高端网站建设与定制开发一站式解决方案 中企动力  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  详解Oracle修改字段类型方法总结  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  java获取注册ip实例  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  高防服务器租用指南:配置选择与快速部署攻略  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  济南网站建设制作公司,室内设计网站一般都有哪些功能?  详解vue.js组件化开发实践  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何实现建站之星域名转发设置?  如何在IIS中新建站点并配置端口与IP地址?  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  智能起名网站制作软件有哪些,制作logo的软件?  linux写shell需要注意的问题(必看)  如何用腾讯建站主机快速创建免费网站?  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  android nfc常用标签读取总结  微信小程序 wx.uploadFile无法上传解决办法  JavaScript Ajax实现异步通信  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  制作旅游网站html,怎样注册旅游网站?  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  javascript读取文本节点方法小结  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  Java遍历集合的三种方式  无锡营销型网站制作公司,无锡网选车牌流程?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  JavaScript如何实现路由_前端路由原理是什么  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  如何在Tomcat中配置并部署网站项目?  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Laravel怎么实现模型属性的自动加密  nodejs redis 发布订阅机制封装实现方法及实例代码  想要更高端的建设网站,这些原则一定要坚持!  独立制作一个网站多少钱,建立网站需要花多少钱?  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  EditPlus中的正则表达式 实战(4)  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  网站制作企业,网站的banner和导航栏是指什么?  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  如何在腾讯云服务器上快速搭建个人网站?