SpringMVC接受参数详解—基本类型和包装类篇

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并不会自动验证简单类型的方法参数(如StringInteger等)。若要让这些约束注解生效,需要在控制器方法参数前使用@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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值