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
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
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
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
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
2
总结
通过自定义格式化器和转换器,Spring MVC能够自动处理和转换请求参数,使得控制器方法可以直接接收指定类型的参数,简化了数据绑定和格式化的过程。这种配置方式在处理复杂的数据转换场景时非常有用。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08