SpringBoot中的Converter解密,强大!
大家好,我是路人,这是 SpringMVC 系列第 30 篇。
本文将讲解 Spring 中的另外一个知识点:SpringMVC 中转换器Converter
的使用。
好陌生啊,这玩意是干啥的呢?请往下看。
1、来看一个需求
如下,有一个 UserDto 类,表示用户信息
public class UserDto {
//用户名
private String name;
//年龄
private Integer age;
//省略getter、setter方法
}
要求后台所有接口接受UserDto
数据时,参数的值格式为:name,age
,比如下面接口
@RequestMapping("/convert/test1")
public UserDto test1(@RequestParam("user") UserDto user) {
System.out.println("name:" + user.getName());
System.out.println("age:" + user.getAge());
return user;
}
能够接受的请格式:/convert/test1?user=ready,1
,这种需求如何实现呢?
2、需用 Converter 接口来实现
SpringMVC 中为我们提供的另外一个接口org.springframework.core.convert.converter.Converter
,这个接口用来将一种类型转换为另一种类型,看看其源码如下,调用后端接口的时候,http 传递的参数都是字符串类型的,但是后端却可以使用 Integer、Double 等其他类型来接收,这就是Converter
实现的。
@FunctionalInterface
public interface Converter<S, T> {
/**
* 将source转换为目标T类型
*/
@Nullable
T convert(S source);
}
Spring 内部提供了很多默认的实现,用于各种类型转换
实现开头的需求,需要我们自定义一个 Converter
3、代码实现
代码如下,添加一个配置类,实现 WebMvcConfigurer
接口重写 addFormatters
方法,在这个方法中添加一个自定义的Converter
,实现其 convert 方法,将name,age
格式的字符串转换为 UserDto 对象返回
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new Converter() {
@Override
public UserDto convert(String source) {
if (source == null) {
return null;
}
String[] split = source.split(",");
String name = split[0];
Integer age = Integer.valueOf(split[1]);
return new UserDto(name, age);
}
});
}
}
接口代码
@RestController
public class ConverterTestController {
@RequestMapping("/convert/test1")
public UserDto test1(@RequestParam("user") UserDto user) {
System.out.println("name:" + user.getName());
System.out.println("age:" + user.getAge());
return user;
}
}
访问请求/convert/test1?user=ready,1
,效果如下:
tomcat 控制台输出
name:ready
age:1
4、案例代码 git 地址
4.1、git 地址
https://gitee.com/javacode2018/springmvc-series
4.2、本文案例代码结构说明
5、SpringMVC 系列目录
SpringMVC 系列第 1 篇:helloword SpringMVC 系列第 2 篇:@Controller、@RequestMapping SpringMVC 系列第 3 篇:异常高效的一款接口测试利器 SpringMVC 系列第 4 篇:controller 常见的接收参数的方式 SpringMVC 系列第 5 篇:@RequestBody 大解密,说点你不知道的 SpringMVC 系列第 6 篇:上传文件的 4 种方式,你都会么? SpringMVC 系列第 7 篇:SpringMVC 返回视图常见的 5 种方式,你会几种? SpringMVC 系列第 8 篇:返回 json & 通用返回值设计 SpringMVC 系列第 9 篇:SpringMVC 返回 null 是什么意思? SpringMVC 系列第 10 篇:异步处理 SpringMVC 系列第 11 篇:集成静态资源 SpringMVC 系列第 12 篇:拦截器 SpringMVC 系列第 13 篇:统一异常处理 SpringMVC 系列第 14 篇:实战篇:通用返回值 & 异常处理设计 SpringMVC 系列第 15 篇:全注解的方式 & 原理解析 SpringMVC 系列第 16 篇:通过源码解析 SpringMVC 处理请求的流程 SpringMVC 系列第 17 篇:源码解析 SpringMVC 容器的启动过程 SpringMVC 系列第 18 篇:强大的 RequestBodyAdvice 解密 SpringMVC 系列第 19 篇:强大的 ResponseBodyAdvice 解密 SpringMVC 系列第 20 篇:RestFull 详解 SpringMVC 系列第 21 篇:接口调用过利器 RestTemplate SpringMVC 系列第 22 篇:参数解析器 HandlerMethodArgumentResolver 解密 SpringMVC 系列第 23 篇:@RequestParam 用法及原理详解 SpringMVC 系列第 24 篇:@RequestBody 用法及原理详解 SpringMVC 系列第 25 篇:@RequestHeader 用法及原理详解 SpringMVC 系列第 26 篇:@CookieValue 用法及原理详解 SpringMVC 系列第 27 篇:@RequestAttribute 详解 SpringMVC 系列第 28 篇:@SessionAttribute 详解 SpringMVC 系列第 29 篇:重定向和转向详解
6、更多系列文章
Spring 高手系列(共 56 篇) Java 高并发系列(共 34 篇) MySql 高手系列(共 27 篇) Maven 高手系列(共 10 篇) Mybatis 系列(共 12 篇) 聊聊 db 和缓存一致性常见的实现方式 接口幂等性这么重要,它是什么?怎么实现? 泛型,有点难度,会让很多人懵逼,那是因为你没有看这篇文章!
7、最新资料
尚硅谷 Java 学科全套教程(总 207.77GB) 2021 最新版 Java 微服务学习线路图 + 视频 阿里技术大佬整理的《Spring 学习笔记.pdf》 阿里大佬的《MySQL 学习笔记高清.pdf》 2021 版 java 高并发常见面试题汇总.pdf Idea 快捷键大全.pdf
评论