1.概述
SpringBoot在处理请求时,会将请求参数从字符串转换成对应的对象,这是由SpringBoot内置的参数转换器Converter
实现。除此之外,SpringBoot也支持用户自定义实现参数转换器,以应对一些特殊情况。
2.快速开始
目标:将请求链接http://localhost:8080/user?user=xxx-xxx-xxx
中"xxx-xxx-xxx"
格式的字符串转换为User
类型的对象,实体类User
如下:
@Data
public class User {
private Integer age;
private String name;
private String email;
}
0.搭建SpringBoot环境,并新建User
实体类
1.注册Converter
类型的bean实例到 IOC 容器
方式一:自定义转换器,实现Converter
接口,并注册到 IOC 容器
注意是org.springframework.core.convert.converter.Converter
包中的Converter
接口
@Component
public class StringToUserConverter implements Converter<String, User> {
@Override
public User convert(String s) {
String[] split = s.split("-");
User user = new User();
user.setName(split[0]);
user.setAge(Integer.parseInt(split[1]));
user.setEmail(split[2]);
return user;
}
}
方式二:注册Converter
对象到FormatterRegistry
中
新建配置类继承WebMvcConfigurer
接口,并实现其中的addFormatters()
方法
// 新建配置类(注意加@Configuration注解),实现WebMvcConfigurer接口,并重写addFormatters()方法
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new Converter<String, User>() {
@Override
public User convert(@NotNull final String source) {
String[] split = source.split("-");
User user = new User();
user.setName(split[0]);
user.setAge(Integer.parseInt(split[1]));
user.setEmail(split[2]);
return user;
}
});
}
}
3.新建一个Controller
类用于测试
存在的问题:参数转换器好像只能转换url中参数名为user=xxx-xxx-xxx
,换个参数名好像不能解析,如para=xxx-xxx-xxx
。
@Controller
public class HelloController {
@GetMapping("/userConverter")
public @ResponseBody User user(@RequestParam("params") User user) {
System.out.println(user);
return user;
}
说明:@RequestParam("params")
注解要求请求必须传递名为params
的参数,并通过参数转换器注入给user对象,url为:.../userConverter?params=xxx-xxx-xxx
。如果不加注解,则可以不必强制传递参数,但是如果要注入给user对象,则需要传递参数名为类名首字母小写,url即为:.../userConverter?user=xxx-xxx-xxx
。
4.访问效果展示
启动项目,浏览器访问链接:http://localhost:8080/userConverter?params=ja-12-111100qq.com ,返回“{“age”:12,“name”:“ja”,“email”:“111100qq.com”}”字样。
3.实际应用
TODO:待补充