在之前的自定义参数接收请求参数时,分析为自定义参数的内部属性赋值时,在复制过程中会调用一个WebDataBind,在这个里面会调用到很多个converterbinder,这些binder在处理自定义参数流程中的为参数赋值的步骤中被调用,然后从很多converter里面找到能处理当前的请求参数和控制参数之间关系的转换器converter,拿到后用它将请求参数解析,完成操作请求参数,并将结果相应在页面上。
首先
创建一个表单用来提交数据
本来能够用springboot的级联方式确定提交的内容中是控制器参数的那个属性,但是现在有需求说就让他们一次性提交所有内容用逗号分开,按特定顺序。
再做一个控制器方法和接收参数的bean类。
在bean中
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String username;
private String password;
private String sex;
private String age;
}
在控制器中
现在就是问题是怎么让这个请求传来的参数里面的每个值都和user对象中的属性对应上
@RequestMapping("/converter")
@ResponseBody
public User testConverter(User user){
return user;
}
配置自定义的converter类型转换器
来到配置类中
早在之前就知道,springBoot启动时会有很多自动配置启动,然后也看过源码都有哪些自动配置类。也知道添加配置就是为容器添加组件,所以必须要用注解@Bean,不然不会被添加到容器中,不会生效也不会解析参数,而且在浏览WebMvcAutoConfiguration自动配置类时,会发现很多配置都可以定制化即用户自己配置,而想要添加组件,可以创建一个id值为webMvcConfigurer【方法名,随便写也行就是不好找】返回值为WebMvcConfigurer的定制化组件。
在里面需要返回一个WebMvcConfigurer,他是一个接口,在里面有很多默认方法,找到一个addFormatters,看注释就知道是添加一些转换器和格式化程序的。重写这个方法,看她的参数,就会发现,参数能调用一个叫addConverter的方法,然后就是写关于本次自定义控制器的逻辑【即制作一个转换器converter添加到容器中-->>把按照逗号分开的请求参数分割赋值给user的内部属性】
@Bean
public WebMvcConfigurer webMvcConfigurer(){
return new WebMvcConfigurer(){
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new Converter() {
@Override
public User convert(String source) {
User user = new User();
String[] params = source.split(",");
user.setUsername(params[0]);
user.setPassword(params[1]);
user.setSex(params[2]);
user.setAge(params[3]);
return user;
}
});
}
};
}
源码中
这一步就是那个给控制器参数赋值,进去会先拿参数解析器,然后解析参数并赋值
会来到这个方法里面
有一个参数WebDataBinderFactory,它在方法拿到参数解析器后,可以从控制台中看见他的内部属性值
@Override
@Nullable
public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {
HandlerMethodArgumentResolver resolver = getArgumentResolver(parameter);
if (resolver == null) {
throw new IllegalArgumentException("Unsupported parameter type [" +
parameter.getParameterType().getName() + "]. supportsParameter should be called first.");
}
return resolver.resolveArgument(parameter, mavContainer, webRequest, binderFactory);
}
converter本来124个,现在125,最后一个就是添加的转换器
结果
在表单里输入的是:name,pass,man,18



