SpringBoot基于HttpMessageConverter实现全局日期格式化

下面是详细讲解“SpringBoot基于HttpMessageConverter实现全局日期格式化”的完整攻略。

1. 什么是HttpMessageConverter

HttpMessageConverter 是 Spring 框架中的一个接口,用于将请求和响应的数据转换为特定的格式。它可以将浏览器提交的数据(如:application/json 、 application/xml、text/html等)转换成 Java 对象,并将 Java 对象转换成指定格式的数据。

在 SpringBoot 应用中,HttpMessageConverter 可以帮我们自动将返回结果序列化成 Json / XML格式,并通过 Jackson / Xstream 等自动配置转换。通过配置 HttpMessageConverter 可以非常方便地统一自定义转换器。

2. 全局日期格式化

在 SpringBoot 中,如果我们不指定日期格式,会默认返回 yyyy-MM-dd HH:mm:ss 格式的日期字符串,但是如果要统一规定一种日期格式,我们可以通过自定义 HttpMessageConverter 来实现。下面是具体的步骤:

2.1 自定义 DateConverter

我们需要先创建一个自定义的日期转换器 DateConverter,继承自 SpringMvc 提供的 WebMvcConfigurerAdapter类,然后在其中重写 configureMessageConverters()方法,并在该方法中设置我们的日期格式。

import java.nio.charset.Charset;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
import org.springframework.http.converter.xml.MarshallingHttpMessageConverter;
import org.springframework.oxm.xstream.XStreamMarshaller;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class DateConverter extends WebMvcConfigurerAdapter {

    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 调用父类的configureMessageConverters方法,保留默认的转换器
        super.configureMessageConverters(converters);

        // 设置日期格式化
        DateFormatter formatter = new DateFormatter();
        formatter.setPattern(DATE_FORMAT);

        // 创建 MappingJackson2HttpMessageConverter 作为默认的JSON转换器
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        jackson2HttpMessageConverter.setObjectMapper(new ObjectMapper().setDateFormat(formatter));

        // 创建 MappingJackson2XmlHttpMessageConverter 作为默认的XML转换器
        MappingJackson2XmlHttpMessageConverter jackson2XmlHttpMessageConverter = new MappingJackson2XmlHttpMessageConverter();
        jackson2XmlHttpMessageConverter.setObjectMapper(new ObjectMapper().setDateFormat(formatter));

        // 创建 MarshallingHttpMessageConverter 对象,作为默认的XML转换器
        MarshallingHttpMessageConverter xmlConverter = new MarshallingHttpMessageConverter();

        // 注意:在使用 XStreamMarshaller 对象对 XML 数据进行转换时,必须先调用 setSupportedMediaTypes 方法设置媒体类型
        xmlConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_XML));

        // 创建 XStreamMarshaller 对象用于 XML 数据的转换
        XStreamMarshaller xstreamMarshaller = new XStreamMarshaller();
        xstreamMarshaller.setConverters(new DateConverter(new SimpleDateFormat(DATE_FORMAT)));

        xmlConverter.setMarshaller(xstreamMarshaller);
        xmlConverter.setUnmarshaller(xstreamMarshaller);

        // 新增字符串支持
        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));

        converters.add(jackson2HttpMessageConverter);
        converters.add(jackson2XmlHttpMessageConverter);
        converters.add(xmlConverter);
        converters.add(stringHttpMessageConverter);
    }

    private class DateFormatter extends DateFormat { 

        private static final long serialVersionUID = 1L;      

        public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
            return new SimpleDateFormat(DATE_FORMAT).format(date, toAppendTo, fieldPosition);
        }

        public Date parse(String source, ParsePosition pos) {
            try {
                return new SimpleDateFormat(DATE_FORMAT).parse(source); // source->date
            } catch (Exception e) {
                return null;
            }
        }

        public Date parse(String source) throws ParseException {
            return new SimpleDateFormat(DATE_FORMAT).parse(source);
        }
    }
}

2.2 配置自定义 DateConverter

我们还需将自定义的 DateConverter 注册到 SpringBoot 项目中,这里有两种方式:

  1. 将配置类 DateConverter 所在包扫描,让其注册到 SpringBoot 项目中:
@SpringBootApplication(scanBasePackages = {"com.example.demo"})
  1. 将配置类 DateConverter 在配置文件中注册到 SpringBoot 项目:
spring:
  mvc:
    messageConverters:
      string:
        charset: UTF-8
        enabled: true
        # HttpHeaders and those with MediaType.APPLICATION_OCTET_STREAM_VALUE are not affected
        # by the JSON vulnerability protection, which can potentially cause a vulnerability
        # on old browsers on the sites with mostly open attackers. Other defaults are still
        # applied.
        enable-buffering: false
        writeAcceptCharset: false
      jackson:
        prettyPrint: false
        writeDatesAsTimestamps: false
        dateFormat: yyyy-MM-dd HH:mm:ss
      jackson2:
        prettyPrint: false
        writeDatesAsTimestamps: false
        dateFormat: yyyy-MM-dd HH:mm:ss
      mappingJackson2Xml:
        prettyPrint: false
        writeDatesAsTimestamps: false
        dateFormat: yyyy-MM-dd HH:mm:ss
      xstream:
        enabled: true
        # HttpHeaders and those with MediaType.APPLICATION_OCTET_STREAM_VALUE are not affected
        # by the JSON vulnerability protection, which can potentially cause a vulnerability
        # on old browsers on the sites with mostly open attackers. Other defaults are still
        # applied.
        enable-buffering: false
        writeAcceptCharset: false
        supported-media-types: application/xml
        marshaller: com.example.demo.converter.DateConverter
        unmarshaller: com.example.demo.converter.DateConverter

这两种方式都可以帮我们完成自定义的日期格式化转换器的注册。

2.3 测试自定义日期格式化

现在我们已经完成了自定义的日期格式化转换器的编写,并成功将其注册到 SpringBoot 项目中,下面我们来测试一下自定义日期格式化能否正常工作。

以下是两个简单的控制器,分别返回日期类型的字符串和对象:

@RestController
public class DateController {

    @GetMapping("/string")
    public String testString() {
        return "当前时间:" + new Date();
    }

    @GetMapping("/date")
    public Date testDate() {
        return new Date();
    }
}

在访问控制器的时候,我们可以设置 Accept 头信息为 application/xml 或 application/json,在控制器返回响应时,我们就能看到在此情况下日期就会变成指定的格式了。

3. 总结

自定义 HttpMessageConverter 是 SpringBoot 框架中非常常见和重要的操作,可以方便地实现对请求和响应数据的统一处理。而在某些特定的场景中,自定义日期格式化转换器也是非常有必要的,这样能保证在整个项目中,日期输出格式是一致的,增加程序的可读性和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot基于HttpMessageConverter实现全局日期格式化 - Python技术站

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

相关文章

  • Farpoint的简单用法简要概述

    Farpoint的简单用法简要概述 Farpoint是一款由美国开发商研发的企业级Excel组件,旨在增强Excel的导入导出、处理、编辑等功能,提高研发、业务等效率。Farpoint可以集成在.NET版本的Visual Studio中,使用也较为简单。本篇攻略将详细讲解Farpoint的简单用法,帮助开发者更好地使用该组件。 1. Farpoint的安装与…

    Java 2023年6月16日
    00
  • Java全面分析面向对象之多态

    Java全面分析面向对象之多态 什么是多态 多态是面向对象语言中非常重要的一种处理方式。它允许在程序执行时根据实际对象类型选择要调用的方法。多态的实现基于继承、接口和重写。 多态的实现 多态的实现有两种方式: 1.继承 通过继承父类,在子类中重写父类的方法,达到不同类调用同一方法返回不同结果的效果。示例如下: class Animal { void move…

    Java 2023年5月26日
    00
  • 什么是类加载的委派模型?

    简介 Java语言采用的是基于类的面向对象编程思想,当Java程序需要使用一个类时,它会根据类的名称来寻找对应的字节码文件,并将字节码文件加载到JVM中。类加载的委派模型是指,当Java程序需要加载一个类时,先委派父类加载器去加载该类,如果父类加载器无法加载该类,则交给当前类加载器自行加载。 工作原理 类加载的委派模型是Java虚拟机(JVM)用来保证Jav…

    Java 2023年5月10日
    00
  • java实现简单超市管理系统

    Java实现简单超市管理系统攻略 本文将介绍如何使用Java语言实现一个简单的超市管理系统,包括设计思路、功能需求、创建Java项目、数据库设计、代码实现等方面。本超市管理系统将实现包括用户登录、商品管理、仓库管理、销售管理等基本功能,从而满足超市日常管理需求。 设计思路 总体思路是基于Java Web实现一个简单的超市管理系统。首先,需要确定所需的基本功能…

    Java 2023年5月18日
    00
  • SpringBoot集成Mybatis并测试

    下面是SpringBoot集成Mybatis并测试的完整攻略: 环境准备 在开始之前,我们需要进行一些准备工作: JDK环境和Maven环境的安装 IntelliJ IDEA或Eclipse IDE的安装 数据库环境的配置以及需要连接的数据库 项目配置 创建项目 在IDE中创建一个SpringBoot项目,并添加所需依赖。pom.xml中需要添加如下依赖: …

    Java 2023年5月20日
    00
  • Spring Security实现基于角色的访问控制框架

    Spring Security实现基于角色的访问控制框架 1. 简介 Spring Security是一个功能强大且灵活的框架,用于在Java应用程序中实现身份验证和访问控制。它提供了很多安全性功能,包括身份验证、授权、会话管理、密码管理等。在这篇文章中,我们将了解如何使用Spring Security实现基于角色的访问控制框架。 2. 实现方法 2.1 准…

    Java 2023年6月3日
    00
  • Sprint Boot @JsonFormat使用方法详解

    @JsonFormat是Spring Boot中的一个注解,用于指定Java对象在序列化为JSON字符串时的日期格式。在本文中,我们将详细介绍@JsonFormat注解的作用和使用方法,并提供两个示例。 @JsonFormat注解的作用 @JsonFormat注解用于指定Java对象在序列化为JSON字符串时的日期格式。当使用@JsonFormat注解标记一…

    Java 2023年5月5日
    00
  • 深入理解JavaScript中的对象

    深入理解JavaScript中的对象 什么是JavaScript中的对象 在JavaScript中,对象是一种复合数据类型,可以将它们看作是键值对的集合,其中每个键都是字符串类型,每个值可以是任何数据类型,包括更多的对象。JavaScript中的对象有两种基本类型:内置对象和自定义对象。内置对象指的是在JavaScript中已经定义好的对象,例如Math、D…

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