【SpringBoot进阶】自定义参数转换器

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:待补充

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值