解决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


相关推荐: 如何自定义建站之星网站的导航菜单样式?  如何快速完成中国万网建站详细流程?  如何快速生成高效建站系统源代码?  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  MySQL查询结果复制到新表的方法(更新、插入)  无锡营销型网站制作公司,无锡网选车牌流程?  如何破解联通资金短缺导致的基站建设难题?  如何快速搭建高效WAP手机网站吸引移动用户?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Python并发异常传播_错误处理解析【教程】  高端云建站费用究竟需要多少预算?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  非常酷的网站设计制作软件,酷培ai教育官方网站?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  网站图片在线制作软件,怎么在图片上做链接?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  Laravel怎么判断请求类型_Laravel Request isMethod用法  JS弹性运动实现方法分析  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  香港服务器租用每月最低只需15元?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  网易LOFTER官网链接 老福特网页版登录地址  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  如何在云指建站中生成FTP站点?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  如何登录建站主机?访问步骤全解析  Swift开发中switch语句值绑定模式  微信h5制作网站有哪些,免费微信H5页面制作工具?  制作企业网站建设方案,怎样建设一个公司网站?  如何用VPS主机快速搭建个人网站?  php 三元运算符实例详细介绍  如何在宝塔面板中修改默认建站目录?  Laravel如何与Pusher实现实时通信?(WebSocket示例)  如何在香港服务器上快速搭建免备案网站?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何基于PHP生成高效IDC网络公司建站源码?  微信小程序 scroll-view组件实现列表页实例代码  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  历史网站制作软件,华为如何找回被删除的网站?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何在IIS中新建站点并配置端口与物理路径?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧