SpringBoot中的Converter解密,強(qiáng)大!
大家好,我是路人,這是 SpringMVC 系列第 30 篇。
本文將講解 Spring 中的另外一個(gè)知識(shí)點(diǎn):SpringMVC 中轉(zhuǎn)換器Converter的使用。
好陌生啊,這玩意是干啥的呢?請(qǐng)往下看。
1、來(lái)看一個(gè)需求
如下,有一個(gè) UserDto 類(lèi),表示用戶(hù)信息
public?class?UserDto?{
????//用戶(hù)名
????private?String?name;
????//年齡
????private?Integer?age;
????//省略getter、setter方法
}
要求后臺(tái)所有接口接受UserDto數(shù)據(jù)時(shí),參數(shù)的值格式為: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;
}
能夠接受的請(qǐng)格式:/convert/test1?user=ready,1,這種需求如何實(shí)現(xiàn)呢?
2、需用 Converter 接口來(lái)實(shí)現(xiàn)
SpringMVC 中為我們提供的另外一個(gè)接口org.springframework.core.convert.converter.Converter,這個(gè)接口用來(lái)將一種類(lèi)型轉(zhuǎn)換為另一種類(lèi)型,看看其源碼如下,調(diào)用后端接口的時(shí)候,http 傳遞的參數(shù)都是字符串類(lèi)型的,但是后端卻可以使用 Integer、Double 等其他類(lèi)型來(lái)接收,這就是Converter實(shí)現(xiàn)的。
@FunctionalInterface
public?interface?Converter<S,?T>?{
?/**
??*?將source轉(zhuǎn)換為目標(biāo)T類(lèi)型
??*/
?@Nullable
?T?convert(S?source);
}
Spring 內(nèi)部提供了很多默認(rèn)的實(shí)現(xiàn),用于各種類(lèi)型轉(zhuǎn)換

實(shí)現(xiàn)開(kāi)頭的需求,需要我們自定義一個(gè) Converter
3、代碼實(shí)現(xiàn)
代碼如下,添加一個(gè)配置類(lèi),實(shí)現(xiàn) WebMvcConfigurer接口重寫(xiě) addFormatters方法,在這個(gè)方法中添加一個(gè)自定義的Converter,實(shí)現(xiàn)其 convert 方法,將name,age格式的字符串轉(zhuǎn)換為 UserDto 對(duì)象返回
@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;
????}
}
訪問(wèn)請(qǐng)求/convert/test1?user=ready,1,效果如下:

tomcat 控制臺(tái)輸出
name:ready
age:1
4、案例代碼 git 地址
4.1、git 地址
https://gitee.com/javacode2018/springmvc-series
4.2、本文案例代碼結(jié)構(gòu)說(shuō)明

5、SpringMVC 系列目錄
SpringMVC 系列第 1 篇:helloword SpringMVC 系列第 2 篇:@Controller、@RequestMapping SpringMVC 系列第 3 篇:異常高效的一款接口測(cè)試?yán)?/a> SpringMVC 系列第 4 篇:controller 常見(jiàn)的接收參數(shù)的方式 SpringMVC 系列第 5 篇:@RequestBody 大解密,說(shuō)點(diǎn)你不知道的 SpringMVC 系列第 6 篇:上傳文件的 4 種方式,你都會(huì)么? SpringMVC 系列第 7 篇:SpringMVC 返回視圖常見(jiàn)的 5 種方式,你會(huì)幾種? SpringMVC 系列第 8 篇:返回 json & 通用返回值設(shè)計(jì) SpringMVC 系列第 9 篇:SpringMVC 返回 null 是什么意思? SpringMVC 系列第 10 篇:異步處理 SpringMVC 系列第 11 篇:集成靜態(tài)資源 SpringMVC 系列第 12 篇:攔截器 SpringMVC 系列第 13 篇:統(tǒng)一異常處理 SpringMVC 系列第 14 篇:實(shí)戰(zhàn)篇:通用返回值 & 異常處理設(shè)計(jì) SpringMVC 系列第 15 篇:全注解的方式 ?&? 原理解析 SpringMVC 系列第 16 篇:通過(guò)源碼解析 SpringMVC 處理請(qǐng)求的流程 SpringMVC 系列第 17 篇:源碼解析 SpringMVC 容器的啟動(dòng)過(guò)程 SpringMVC 系列第 18 篇:強(qiáng)大的 RequestBodyAdvice 解密 SpringMVC 系列第 19 篇:強(qiáng)大的 ResponseBodyAdvice 解密 SpringMVC 系列第 20 篇:RestFull 詳解 SpringMVC 系列第 21 篇:接口調(diào)用過(guò)利器 RestTemplate SpringMVC 系列第 22 篇:參數(shù)解析器 HandlerMethodArgumentResolver 解密 SpringMVC 系列第 23 篇:@RequestParam 用法及原理詳解 SpringMVC 系列第 24 篇:@RequestBody 用法及原理詳解 SpringMVC 系列第 25 篇:@RequestHeader 用法及原理詳解 SpringMVC 系列第 26 篇:@CookieValue 用法及原理詳解 SpringMVC 系列第 27 篇:@RequestAttribute 詳解 SpringMVC 系列第 28 篇:@SessionAttribute 詳解 SpringMVC 系列第 29 篇:重定向和轉(zhuǎn)向詳解
6、更多系列文章
Spring 高手系列(共 56 篇) Java 高并發(fā)系列(共 34 篇) MySql 高手系列(共 27 篇) Maven 高手系列(共 10 篇) Mybatis 系列(共 12 篇) 聊聊 db 和緩存一致性常見(jiàn)的實(shí)現(xiàn)方式 接口冪等性這么重要,它是什么?怎么實(shí)現(xiàn)? 泛型,有點(diǎn)難度,會(huì)讓很多人懵逼,那是因?yàn)槟銢](méi)有看這篇文章!
7、最新資料
尚硅谷 Java 學(xué)科全套教程(總 207.77GB) 2021 最新版 Java 微服務(wù)學(xué)習(xí)線路圖 + 視頻 阿里技術(shù)大佬整理的《Spring 學(xué)習(xí)筆記.pdf》 阿里大佬的《MySQL 學(xué)習(xí)筆記高清.pdf》 2021 版 java 高并發(fā)常見(jiàn)面試題匯總.pdf Idea 快捷鍵大全.pdf
