SpringMVC接收参数详解—基本类型和包装类篇
相信小伙伴们都会有给controller传参的经历,但是springmvc内部是如何处理这些参数的。今天就带大家来看一看使用基本类型或包装类情况下的实现。
一、包装类
最近在写代码时发现
int[] a=new int[3];
Integer[]b=new Integer[3];
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
结果是不一样的,一个默认初始化为0,一个默认初始化为null。因此想和SpringMVC的接受参数联系一下。
构造测试类:
@GetMapping("/test3")
public String test3(Integer integer)
{
System.out.println(integer);
return "test3";
}
框架行为详解:
- 若不传或传入的参数名和形参变量名不匹配,则integer初始化为null
- 若传入正确的参数名和值,则初始化为对应的数值
- 若传入正确的参数名,但值为字符串或小数,则抛出异常MethodArgumentTypeMismatchException
二、基本类型
@GetMapping("/test4")
public String test4(int testInt)
{
System.out.println(testInt);
return "test4";
}
框架行为详解:
- 若不传或传入的参数名和形参变量名不匹配,则直接抛出异常:int不能初始化为null。从这里我们得知,尽量不要使用基本类型来接受参数
- 若传入正确的参数名和值,则初始化为对应的数值
- 若传入正确的参数名,但值为字符串或小数,则抛出异常MethodArgumentTypeMismatchException
三、结合SpringValidation框架
上述信息告诉我们,如果用基本类型来接受参数,则若不传或传入的参数名和形参变量名不匹配会直接抛出异常。因此我们尽量使用包装类来接受参数。在这种情况下,结合SpringValidation框架来进行校验。
1.在class上加上@Validated/@Valid
在默认配置下,Spring MVC并不会自动验证简单类型的方法参数(如String
、Integer
等)。若要让这些约束注解生效,需要在控制器方法参数前使用@Valid
或@Validated
注解来触发验证。
2.在参数前加上注解
Integer前加上@Max,String前加上@Size注解来约束传参条件。但是这些注解无法校验是否为 null(若不传或传入的参数名和形参变量名不匹配,则integer初始化为null),因此前面要配合@NotNull或@NotBlank注解
3.框架抛出并处理异常
-
普通参数上加@NotNull/@Size:
- 若和注解不匹配:抛出ConstraintViolationException
- 若传入正确的参数名,但值为字符串或小数(特指Integer包装类):抛出MethodArgumentTypeMismatchException
-
实体类参数上加@Validated/@Valid:
- 若属性和注解不匹配:抛出MethodArgumentNotValidException
- 若传入正确的参数名,但值为字符串或小数(特指Integer包装类):同样抛出MethodArgumentNotValidException
- 注意:MethodArgumentNotValidException是属性不对就会抛出的,就算不加@Validated或者属性上不加@NotNull注解,该抛也会抛
-
@RequestBody :若不传或不满足json格式则抛出HttpMessageNotReadableException