sss继 《SpringBoot:参数处理原理 ---- 8.2》和SpringBoot:参数处理原理 (复杂参数)---- 8.3(图解)这两篇文章,我们分析一下自定义参数在请求过程中的不同的细节。

  • 自定义对象参数:
  • POJO封装过程
  • 转换过程
  • 自定义转换器

自定义对象参数:

sss可以自动类型转换与格式化,可以级联封装:

/**
 *     姓名: <input name="userName"/> <br/>
 *     年龄: <input name="age"/> <br/>
 *     生日: <input name="birth"/> <br/>
 *     宠物姓名:<input name="pet.name"/><br/>
 *     宠物年龄:<input name="pet.age"/>
 */
@Data
public class Person {
    
    private String userName;
    private Integer age;
    private Date birth;
    private Pet pet;
    
}

@Data
public class Pet {

    private String name;
    private String age;
}
@PostMapping("/saveuser")
    public Person saveuser(Person person){

        return person;
    }

sss结果:

sdsdsdss{“userName”:“zhangsan”,“age”:18,“birth”:“2019-12-09T16:00:00.000+00:00”,“pet”:{“name”:“阿猫”,“age”:5}}

sss可以自动类型转换与格式化,可以级联封装。

POJO封装过程

sss● ServletModelAttributeMethodProcessor 这个参数处理(解析)器支持对自定义类型参数解析。它首先判断其是否含有注解,并且是否是简单类型:

public static boolean isSimpleValueType(Class<?> type) {
		return (Void.class != type && void.class != type &&
				(ClassUtils.isPrimitiveOrWrapper(type) ||
				Enum.class.isAssignableFrom(type) ||
				CharSequence.class.isAssignableFrom(type) ||
				Number.class.isAssignableFrom(type) ||
				Date.class.isAssignableFrom(type) ||
				Temporal.class.isAssignableFrom(type) ||
				URI.class == type ||
				URL.class == type ||
				Locale.class == type ||
				Class.class == type));
	}

sss● 在对参数进行解析时,如果mavContaioner中包含了原来的参数对象,则我们直接取出来使用,而不用重新创建。否则会创建一个空对象。

springboot方法定义泛型入参 springboot自定义参数解析_后端


sss接下来,将requet中的数据全都绑定到这个对象中:

springboot方法定义泛型入参 springboot自定义参数解析_springboot方法定义泛型入参_02


sss以上两步都在一个方法,整体步骤如下:

springboot方法定义泛型入参 springboot自定义参数解析_封装_03


sss【注】:

sdsdsssWebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);

ssdsdssWebDataBinder :web数据绑定器,将请求参数的值绑定到指定的JavaBean里面

sdsdsssWebDataBinder 利用它里面的 Converters 将请求数据转成指定的数据类型。再次封装到JavaBean中。

sdsdsdsss因为我们通过request传过来的数据是利用Http协议传输的,是以文本的形式进行传输,所以我们需要对其进行转换成相应的数据类型,然后利用反射,将其绑定到对象中。

@FunctionalInterfacepublic interface Converter<S, T> 总接口

sdss

springboot方法定义泛型入参 springboot自定义参数解析_后端_04

转换过程

sssGenericConversionService:在设置每一个值的时候,找它里面的所有converter,让其可以将这个数据类型(request带来参数的字符串,一般是string,如果是文件上传,就是流的形式)转换到指定的类型,比如:JavaBean – Integer,byte – > file

sdsdsdsss

springboot方法定义泛型入参 springboot自定义参数解析_springboot方法定义泛型入参_05


sss未来我们可以给WebDataBinder里面放自己的Converter;

ssdsdsdsprivate static final class StringToNumber implements Converter<String, T>

自定义转换器

ssdsdsdssdsdsd

springboot方法定义泛型入参 springboot自定义参数解析_springboot方法定义泛型入参_06


springboot方法定义泛型入参 springboot自定义参数解析_java_07