全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

有时在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 


相关文章: 大连网站设计制作招聘信息,大连投诉网站有哪些?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  开源网站制作软件,开源网站什么意思?  北京企业网站设计制作公司,北京铁路集团官方网站?  如何确保西部建站助手FTP传输的安全性?  如何用景安虚拟主机手机版绑定域名建站?  如何在云主机上快速搭建网站?  如何在阿里云高效完成企业建站全流程?  专业网站建设制作报价,网页设计制作要考什么证?  安云自助建站系统如何快速提升SEO排名?  网站设计制作企业有哪些,抖音官网主页怎么设置?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  建站之星如何实现PC+手机+微信网站五合一建站?  如何彻底删除建站之星生成的Banner?  如何用低价快速搭建高质量网站?  如何在服务器上配置二级域名建站?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  定制建站如何定义?其核心优势是什么?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  建站之星备案是否影响网站上线时间?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  建站之星如何通过成品分离优化网站效率?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  油猴 教程,油猴搜脚本为什么会网页无法显示?  如何在新浪SAE免费搭建个人博客?  如何配置IIS站点权限与局域网访问?  如何选择美橙互联多站合一建站方案?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  Swift中switch语句区间和元组模式匹配  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  家具网站制作软件,家具厂怎么跑业务?  Python路径拼接规范_跨平台处理说明【指导】  宝塔面板如何快速创建新站点?  大型企业网站制作流程,做网站需要注册公司吗?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  Android自定义控件实现温度旋转按钮效果  临沂网站制作企业,临沂第三中学官方网站?  如何在香港免费服务器上快速搭建网站?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  如何在阿里云通过域名搭建网站?  大连网站制作公司哪家好一点,大连买房网站哪个好?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。