SpringBoot中的Converter解密,强大!

共 3616字,需浏览 8分钟

 ·

2022-01-15 15:55

大家好,我是路人,这是 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<ST{

 /**
  * 将source转换为目标T类型
  */

 @Nullable
 convert(S source);
}

Spring 内部提供了很多默认的实现,用于各种类型转换

实现开头的需求,需要我们自定义一个 Converter,将其添加到 SpringMVC 转换器列表中,他负责将 String 类型转换为 UserDto 类型。下面来看具体代码实现

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 系列目录

  1. SpringMVC 系列第 1 篇:helloword
  2. SpringMVC 系列第 2 篇:@Controller、@RequestMapping
  3. SpringMVC 系列第 3 篇:异常高效的一款接口测试利器
  4. SpringMVC 系列第 4 篇:controller 常见的接收参数的方式
  5. SpringMVC 系列第 5 篇:@RequestBody 大解密,说点你不知道的
  6. SpringMVC 系列第 6 篇:上传文件的 4 种方式,你都会么?
  7. SpringMVC 系列第 7 篇:SpringMVC 返回视图常见的 5 种方式,你会几种?
  8. SpringMVC 系列第 8 篇:返回 json & 通用返回值设计
  9. SpringMVC 系列第 9 篇:SpringMVC 返回 null 是什么意思?
  10. SpringMVC 系列第 10 篇:异步处理
  11. SpringMVC 系列第 11 篇:集成静态资源
  12. SpringMVC 系列第 12 篇:拦截器
  13. SpringMVC 系列第 13 篇:统一异常处理
  14. SpringMVC 系列第 14 篇:实战篇:通用返回值 & 异常处理设计
  15. SpringMVC 系列第 15 篇:全注解的方式  &  原理解析
  16. SpringMVC 系列第 16 篇:通过源码解析 SpringMVC 处理请求的流程
  17. SpringMVC 系列第 17 篇:源码解析 SpringMVC 容器的启动过程
  18. SpringMVC 系列第 18 篇:强大的 RequestBodyAdvice 解密
  19. SpringMVC 系列第 19 篇:强大的 ResponseBodyAdvice 解密
  20. SpringMVC 系列第 20 篇:RestFull 详解
  21. SpringMVC 系列第 21 篇:接口调用过利器 RestTemplate
  22. SpringMVC 系列第 22 篇:参数解析器 HandlerMethodArgumentResolver 解密
  23. SpringMVC 系列第 23 篇:@RequestParam 用法及原理详解
  24. SpringMVC 系列第 24 篇:@RequestBody 用法及原理详解
  25. SpringMVC 系列第 25 篇:@RequestHeader 用法及原理详解
  26. SpringMVC 系列第 26 篇:@CookieValue 用法及原理详解
  27. SpringMVC 系列第 27 篇:@RequestAttribute 详解
  28. SpringMVC 系列第 28 篇:@SessionAttribute 详解
  29. SpringMVC 系列第 29 篇:重定向和转向详解

6、更多系列文章

  1. Spring 高手系列(共 56 篇)
  2. Java 高并发系列(共 34 篇)
  3. MySql 高手系列(共 27 篇)
  4. Maven 高手系列(共 10 篇)
  5. Mybatis 系列(共 12 篇)
  6. 聊聊 db 和缓存一致性常见的实现方式
  7. 接口幂等性这么重要,它是什么?怎么实现?
  8. 泛型,有点难度,会让很多人懵逼,那是因为你没有看这篇文章!

7、最新资料

  1. 尚硅谷 Java 学科全套教程(总 207.77GB)
  2. 2021 最新版 Java 微服务学习线路图 + 视频
  3. 阿里技术大佬整理的《Spring 学习笔记.pdf》
  4. 阿里大佬的《MySQL 学习笔记高清.pdf》
  5. 2021 版 java 高并发常见面试题汇总.pdf
  6. Idea 快捷键大全.pdf
浏览 70
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报