springmvc学习笔记-返回json的日期格式问题的解决方法

下面是“springmvc学习笔记-返回json的日期格式问题的解决方法”的完整攻略:

Spring MVC 返回JSON的日期格式问题的解决方法

Spring MVC框架中,我们通常会使用JSON作为数据返回格式,但是在返回JSON数据的时候,日期格式往往会出现一些问题,本文将详细介绍如何解决Spring MVC返回JSON的日期格式问题。

问题描述

在Spring MVC中,我们使用的JSON返回格式常常是yyyy-MM-dd HH:mm:ss格式的日期数据,而前端在解析JSON数据的时候,常常只识别JavaScript日期对象格式,即new Date()对象,如下所示:

{
    "id": 1,
    "name": "张三",
    "birthday": "2021-01-01 12:00:00"
}

在前端解析JSON数据时,可能无法对birthday字段进行正确的解析,导致数据无法正常显示。所以我们需要将后台返回的日期数据转换成JavaScript日期对象格式,才能在前端正确地解析和显示数据。

解决方法

使用Jackson库自定义日期格式

在Spring框架中,我们通常使用Jackson库来将Java对象转换成JSON格式的字符串,并返回给前端。在Jackson库中,我们可以通过自定义日期格式,将Java对象中的日期类型转换成前端可识别的JavaScript日期对象格式。具体做法如下:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

import java.text.SimpleDateFormat;

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();

        // 序列化时统一日期格式
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        objectMapper.setDateFormat(dateFormat);

        // Long类型转String类型,防止js丢失精度
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        objectMapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);

        return objectMapper;
    }

}

在上面的代码中,我们首先通过new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")创建日期格式化对象,将日期格式设置为yyyy-MM-dd HH:mm:ss,然后将日期格式设置到ObjectMapper对象中。接着,我们通过SimpleModule对象,将Long类型转换成String类型,防止js丢失精度。最后将SimpleModule对象注册到ObjectMapper中。

我们需要在Spring MVC的配置文件中,配置上述JacksonConfig类的bean,这样Spring就会将自定义的日期格式和Long类型转换规则应用到JSON的转换中。

使用SpringMVC国际化

除了使用自定义日期格式外,我们还可以使用SpringMVC提供的国际化组件,将后台的日期数据转换成前端可识别的JavaScript日期对象格式。具体做法如下:

import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

@Configuration
public class DateFormatConfiguration {

    private final RequestMappingHandlerAdapter requestMappingHandlerAdapter;

    public DateFormatConfiguration(RequestMappingHandlerAdapter requestMappingHandlerAdapter) {
        this.requestMappingHandlerAdapter = requestMappingHandlerAdapter;
    }

    @PostConstruct
    public void init() {
        List<MappingJackson2HttpMessageConverter> converters = requestMappingHandlerAdapter.getMessageConverters()
                .stream()
                .filter(converter -> converter instanceof MappingJackson2HttpMessageConverter)
                .map(converter -> (MappingJackson2HttpMessageConverter) converter)
                .collect(Collectors.toList());

        if (!converters.isEmpty()) {
            List<Locale> locales = Locale.LanguageRange.parse(StringUtils.trimAllWhitespace("zh-CN"));
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.json();
            builder.serializers(new CustomDateSerializer(dateFormat, locales));
            converters.forEach(converter -> {
                builder.configure(converter.getObjectMapper());
            });
        }
    }

    private static class CustomDateSerializer extends JsonSerializer<Date> {

        private final DateFormat dateFormat;
        private final List<Locale> locales;

        private CustomDateSerializer(DateFormat dateFormat, List<Locale> locales) {
            this.dateFormat = dateFormat;
            this.locales = locales;
        }

        @Override
        public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers)
                throws IOException {
            gen.writeString(value.toInstant()
                    .atZone(ZoneId.systemDefault())
                    .format(DateTimeFormatter.ofPattern(dateFormat.toPattern(), locales.get(0))));
        }

        @Override
        public Class<Date> handledType() {
            return Date.class;
        }
    }
}

在上述代码中,我们使用了SpringMVC的请求处理适配器RequestMappingHandlerAdapter来获取所有的JSON转换器MappingJackson2HttpMessageConverter,然后对每个转换器设置自定义的日期格式。

我们需要在Spring MVC的配置文件中,配置上述DateFormatConfiguration类的bean,这样Spring就会将自定义的日期格式应用到所有的JSON转换中。

示例说明

下面是两个具体的示例,展示如何在Spring MVC中使用自定义日期格式和SpringMVC国际化,将后台的日期数据转换成前端可识别的JavaScript日期对象格式。

示例1:使用自定义日期格式

在Java Controller中,我们可以通过注解@ResponseBody将Java对象转换成JSON格式的字符串,并返回给前端。如下所示:

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/{id}")
    @ResponseBody
    public User getUser(@PathVariable Long id) {
        User user = new User();
        user.setId(id);
        user.setName("张三");
        user.setBirthday(new Date());
        return user;
    }

}

在上面的例子中,我们将User对象中的birthday字段设置为了当前日期对象,后台会使用自定义的日期格式将日期对象转换成字符串形式的日期数据,如下所示:

{
    "id": 1,
    "name": "张三",
    "birthday": "2021-01-01 12:00:00"
}

前端使用new Date(jsonData.birthday)方法,将字符串形式的日期数据转换成日期对象。

示例2:使用SpringMVC国际化

在Java Controller中,我们可以通过注解@ResponseBody将Java对象转换成JSON格式的字符串,并返回给前端。如下所示:

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/{id}")
    @ResponseBody
    public User getUser(@PathVariable Long id) {
        User user = new User();
        user.setId(id);
        user.setName("张三");
        user.setBirthday(new Date());
        return user;
    }

}

在上面的例子中,我们将User对象中的birthday字段设置为了当前日期对象,后台会使用SpringMVC国际化组件将日期对象转换成前端可识别的JavaScript日期对象格式,如下所示:

{
    "id": 1,
    "name": "张三",
    "birthday": "Fri Jan 01 2021 12:00:00 GMT+0800 (中国标准时间)"
}

前端使用new Date(jsonData.birthday)方法,将字符串形式的日期数据转换成日期对象。

结语

本文详细介绍了SpringMVC返回JSON格式数据中日期格式问题的解决方法,包括使用Jackson库自定义日期格式和使用SpringMVC国际化组件,使后台的日期数据转换成前端可识别的JavaScript日期对象格式。希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springmvc学习笔记-返回json的日期格式问题的解决方法 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 浅析Bean Searcher 与 MyBatis Plus 区别介绍

    浅析Bean Searcher与MyBatis Plus区别介绍 1. 简介 1.1 Bean Searcher Bean Searcher是一款基于Java注解的ORM框架,支持MySQL、SQLite、H2等关系型数据库。其主要特点是简单易用、注解使用方便、API完整,并支持复杂的查询生成。 1.2 MyBatis Plus MyBatis Plus是M…

    Java 2023年5月20日
    00
  • Hadoop集成Spring的使用详细教程(快速入门大数据)

    下面我会详细讲解“Hadoop集成Spring的使用详细教程(快速入门大数据)”的完整攻略。 概述 Hadoop是大数据处理领域的重要框架,而Spring则是Java开发领域的重要框架,将两者结合起来可以提高大数据处理的效率和可维护性。本教程介绍如何使用Spring集成Hadoop,并提供两个示例:WordCount和PageRank。 环境准备 在开始之前…

    Java 2023年5月19日
    00
  • spring+springmvc+mybatis 开发JAVA单体应用

    下面是关于“spring+springmvc+mybatis 开发JAVA单体应用”的完整攻略: 一、前置知识 在开始之前,需要掌握以下技术: Java基础知识; SQL语言基础; Spring框架基础知识; Spring MVC框架的基础知识; MyBatis框架基础。 如果你已经掌握了以上技术,那么你就可以继续阅读该攻略。 二、搭建环境 1. 安装JDK…

    Java 2023年6月1日
    00
  • JavaSpringBoot报错“MissingServletRequestParameterException”的原因和处理方法

    原因 “MissingServletRequestParameterException” 错误通常是以下原因引起的: 缺少请求参数:如果您的请求参数缺失,则可能会出现此错误。在这种情况下,您需要检查您的请求参数并确保它们存在。 请求参数类型不正确:如果您的请求参数类型不正确,则可能会出现此错误。在这种情况下,您需要检查您的请求参数类型并确保它们正确。 解决办…

    Java 2023年5月4日
    00
  • java删除数组中的某一个元素的方法

    下面提供详细的“Java删除数组中的某一个元素的方法”的攻略。 1. 使用System.arraycopy方法删除数组中的元素 System.arraycopy方法能够在保持原数组中其他元素未变的前提下,将需要删除的元素移除,从而实现删除数组中某一元素的目的。 下面是该方式的代码示例: public static void main(String[] arg…

    Java 2023年5月26日
    00
  • python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解

    Python中的print()函数和Java中的System.out.print()都是输出函数,它们都可以向控制台输出内容。下面详细讲解两者的区别以及两者在输出时“+”的功能。 Python中print()函数 语法 print(value1, value2, …, sep=’ ‘, end=’\n’, file=sys.stdout, flush=F…

    Java 2023年5月26日
    00
  • Java jdbc批量多线程读取CVS文件入库

    Java jdbc批量多线程读取CSV文件并入库,可以分为以下步骤: 读取CSV文件:使用开源库OpenCSV或者Apache Commons CSV都可以实现。读取CSV文件时可以使用多线程处理提高效率,可以通过将文件划分为多个小文件,使用多个线程并发读取来实现。 数据库连接:使用JDBC连接数据库,并获取数据库连接对象Connection。可以使用数据库…

    Java 2023年6月16日
    00
  • Java实现Excel导入导出数据库的方法示例

    下面是Java实现Excel导入导出数据库的方法示例的完整攻略: 一、Excel导入数据库: 首先,需要添加相关的依赖包,如以下示例代码所示: <!– poi组件 –> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi&…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部