SpringBoot---web-->>自定义converter【类型转换器】响应原理【使用添加converter配置指定类型转换,接收请求参数】(7)

自定义converter【类型转换器】响应原理【使用添加converter配置指定类型转换,接收请求参数】

在之前的自定义参数接收请求参数时,分析为自定义参数的内部属性赋值时,在复制过程中会调用一个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

SpringBoot---web-->>自定义converter【类型转换器】响应原理【使用添加converter配置指定类型转换,接收请求参数】(7)_第1张图片

你可能感兴趣的:(SpringBoot,spring,boot)