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日

相关文章

  • Java Apache POI报错“MissingSheetException”的原因与解决办法

    “MissingCellDataException”是Java的Apache POI类库中的一个异常,通常由以下原因之一引起: 单元格错误:如果单元格中缺少数据,则可能会出现此异常。例如,可能会尝试读取不存在的单元格或尝试读取未填充的单元格。 以下是两个实例: 例1 如果单元格中缺少数据,则可以尝试使用正确的单元格以解决此问题。例如,在Java中,可以使用以…

    Java 2023年5月5日
    00
  • java实现文件夹解压和压缩

    我们来详细讲解一下如何使用Java实现对文件夹的解压和压缩。 1. 前置条件 在开始之前,需要先确保满足以下几个前置条件: 确认已经安装了Java开发环境(JDK) 确认已经安装了Apache Ant 确认已经下载了Apache Ant的压缩包,并解压到一个路径下,并将其加入系统环境变量 2. 文件夹压缩 我们可以使用Ant的zip任务来实现文件夹的压缩。在…

    Java 2023年5月20日
    00
  • springboot封装JsonUtil,CookieUtil工具类代码实例

    下面开始讲解”Spring Boot封装JsonUtil,CookieUtil工具类代码实例”的攻略,主要包含以下几步: 1. 创建工具类文件 在src/main/java目录下创建一个名为utils的包,然后在该包下创建两个工具类文件:JsonUtil和CookieUtil。 1.1 JsonUtil JsonUtil用于将Java对象与Json数据相互转…

    Java 2023年5月26日
    00
  • Java中删除文件或文件夹的几种方法总结

    让我来为你详细讲解“Java中删除文件或文件夹的几种方法总结”这个话题。 简介 在Java中,我们可以使用各种方法来删除文件或者文件夹。本文将总结出最常用的几种方式。 方法一:File类的delete()方法 我们可以使用Java中的File类的delete()方法来删除一个单独的文件,如下所示: File file = new File("pat…

    Java 2023年5月20日
    00
  • JAVA抛出异常的三种形式详解

    JAVA抛出异常的三种形式详解 在Java中,任何程序都可能出现异常情况,这时候就需要通过抛出异常来处理,避免程序崩溃。在Java中,抛出异常有三种形式:抛出自定义异常,抛出Java API提供的异常和抛出运行时异常。 1. 抛出自定义异常 抛出自定义异常意味着创建一个新的异常类,该类继承自Exception或RuntimeException。创建自定义异常…

    Java 2023年5月26日
    00
  • Apache Tomcat 6.0安装配置图文详细教程(附下载)

    我将为您详细讲解关于“Apache Tomcat 6.0安装配置图文详细教程(附下载)”的完整攻略。 1. 下载Tomcat 首先,您需要前往Tomcat官方网站下载Apache Tomcat 6.0。进入官网后,在主页的左侧导航栏中,选择“Downloads”进行下载。 示例1:通过https://tomcat.apache.org/download-60…

    Java 2023年5月19日
    00
  • Java中实现代码优化的技巧分享

    Java中实现代码优化的技巧分享 在编写Java代码时,我们可能会遇到一些性能上的问题,比如程序运行速度变慢、内存使用过多等。如果遇到这样的问题,代码优化就是一个非常好的解决方案。本文将分享一些Java中实现代码优化的技巧。 1. 减少对象的创建 创建对象也是消耗资源的一个过程,因此我们可以通过减少对象的创建次数来提高程序的执行效率。具体实现方法如下: 1.…

    Java 2023年5月18日
    00
  • spring整合redis以及使用RedisTemplate的方法

    Spring整合Redis以及使用RedisTemplate的方法 什么是Redis? Redis是一个开源的,高级的、基于内存的NoSQL数据库,常用于缓存、队列、分布式锁等应用。它支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等。 Spring整合Redis 1. 环境搭建 首先需要引入Spring Data Redis模块,以及Jedis或L…

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