程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • SpringMVC

    • SpringMVC 入门
    • Spring MVC 数据接收
    • Spring MVC 数据返回
    • Spring MVC 路径匹配规则
    • Spring MVC 内容协商策略
    • Spring MVC 异步请求处理
    • Spring MVC 静态资源处理
    • Spring MVC 自定义格式化器
      • 1. 添加自定义格式化器和转换器
      • 2. 自定义格式化器和转换器的实现
        • 2.1 自定义字符串到日期的转换器
        • 2.2 自定义布尔值格式化器
      • 3. 使用自定义格式化器和转换器的Controller
      • 4. 测试请求
      • 5. 请求结果示例
    • SpringMVC 自定义拦截器
    • SpringMVC 配置跨域(CORS)
    • Spring MVC 自定义视图控制器
    • Spring MVC 自定义视图解析器
    • Spring MVC 自定义方法参数解析器
    • Spring MVC 自定义返回值处理器
    • Spring MVC 自定义消息转换器
    • Spring MVC 消息转换器扩展
    • Spring MVC 自定义异常处理器
    • Spring MVC 自定义异常处理器扩展
  • SpringMVC
  • SpringMVC
scholar
2024-08-17
目录

Spring MVC 自定义格式化器

# Spring MVC 自定义格式化器

前言

在Spring MVC中,格式化器(Formatter)和转换器(Converter)用于在数据绑定过程中进行类型转换。你可以通过实现WebMvcConfigurer接口,并重写addFormatters方法来自定义这些格式化器和转换器,使得请求参数能够自动转换为指定的Java类型。

# 1. 添加自定义格式化器和转换器

通过addFormatters方法向Spring的注册表中添加自定义的格式化器和转换器:

@Configuration
public class MyWebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        // 添加自定义的布尔值格式化器
        registry.addFormatter(booleanFormatter());
        // 添加自定义的字符串到日期的转换器
        registry.addConverter(stringToDateConverter());
    }

    // 定义布尔值格式化器的Bean
    @Bean
    public BooleanFormatter booleanFormatter() {
        return new BooleanFormatter();
    }

    // 定义字符串到日期转换器的Bean
    @Bean
    public StringToDateConverter stringToDateConverter() {
        return new StringToDateConverter();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

关键参数说明:

  • FormatterRegistry:用于注册格式化器和转换器的接口。你可以通过它向Spring的上下文中添加自定义的格式化器和转换器。
  • addFormatter 和 addConverter:这两个方法分别用于添加格式化器和转换器,确保请求参数可以自动转换为指定的类型。

# 2. 自定义格式化器和转换器的实现

# 2.1 自定义字符串到日期的转换器

这个转换器将字符串转换为Date对象,支持多种日期格式:

public class StringToDateConverter implements Converter<String, Date> {
    // 定义支持的日期格式
    private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
    private static final String shortDateFormat = "yyyy-MM-dd";
    private static final String dateFormat2 = "yyyy/MM/dd HH:mm:ss";
    private static final String shortDateFormat2 = "yyyy/MM/dd";

    @Override
    public Date convert(String source) {
        if (source == null || source.isBlank()) {
            return null;
        }
        source = source.trim();
        try {
            SimpleDateFormat formatter;
            // 根据字符串格式选择合适的日期解析器
            if (source.contains("-")) {
                formatter = source.contains(":") ? new SimpleDateFormat(dateFormat) : new SimpleDateFormat(shortDateFormat);
            } else if (source.contains("/")) {
                formatter = source.contains(":") ? new SimpleDateFormat(dateFormat2) : new SimpleDateFormat(shortDateFormat2);
            } else {
                throw new IllegalArgumentException(String.format("无法解析日期格式: %s", source));
            }
            return formatter.parse(source);
        } catch (Exception e) {
            throw new RuntimeException(String.format("解析日期失败: %s", source), e);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

关键点:

  • 根据输入字符串的格式自动选择适当的SimpleDateFormat进行解析。
  • 如果输入的字符串格式不支持,会抛出异常提示格式错误。

# 2.2 自定义布尔值格式化器

这个格式化器将特定的字符串转换为布尔值,例如"是"、"有"等被解析为true:

public class BooleanFormatter implements Formatter<Boolean> {
    // 定义哪些字符串被解析为 true
    private String[] trueTag = {"true", "1", "是", "有"};

    @Override
    public Boolean parse(String text, Locale locale) {
        // 如果输入字符串在trueTag数组中,则返回 true
        return Arrays.asList(trueTag).contains(text.trim().toLowerCase());
    }

    @Override
    public String print(Boolean object, Locale locale) {
        // 将布尔值转换为字符串
        return object ? "true" : "false";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

关键点:

  • 格式化器支持多种表示布尔值的方式,例如中文的"是"、"有"等。
  • 支持将布尔值转换回字符串形式,便于在视图中展示。

# 3. 使用自定义格式化器和转换器的Controller

在Controller中直接使用经过转换的参数:

@RestController
public class TestController {

    @GetMapping("/testFormat")
    public String testFormat(@RequestParam Date date, @RequestParam Boolean flag) {
        // 输出解析后的日期和布尔值
        System.out.println("日期: " + date);
        System.out.println("布尔值: " + flag);
        return "格式化成功";
    }
}
1
2
3
4
5
6
7
8
9
10
11

# 4. 测试请求

通过以下请求测试自定义格式化器和转换器:

GET http://localhost:8080/testFormat?date=2022-02-22 11:22:33&flag=有
1

# 5. 请求结果示例

日志输出:

日期: Tue Feb 22 11:22:33 CST 2022
布尔值: true
1
2

总结

通过自定义格式化器和转换器,Spring MVC能够自动处理和转换请求参数,使得控制器方法可以直接接收指定类型的参数,简化了数据绑定和格式化的过程。这种配置方式在处理复杂的数据转换场景时非常有用。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
Spring MVC 静态资源处理
SpringMVC 自定义拦截器

← Spring MVC 静态资源处理 SpringMVC 自定义拦截器→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式