SpringBoot 参数校验案例分析

一、参数类型

常用的请求方式一般有两种:GEIPOST,GEI请求的传参方式一般都是直接拼接在url地址中,后台一般都是通过@RequestParam注解来接收url中的参数,当然也可以使用实体对象或者Map来接收;而POST请求一般都是以Json格式的数据放在请求体中,后台通过@RequestBody注解将其转换成对应的实体对象来接收。

(1)接收GET请求参数常见的有两种方式:

  • @RequestParam:通过@RequestParam从GET请求的表单数据或查询参数中提取单个值。
@GetMapping("/parent")
public String createParent(@RequestParam("id") Integer id, @RequestParam("size") Integer size{
    // ...
    return "Parent created successfully";
}
  • 实体对象:将表单数据或查询参数绑定到一个对象上。
@GetMapping("/parent1")
public String createParent1(Parent parent) {
    // ...

    return "Parent1 created successfully";
}

(2)接收POST请求参数一般通过@RequestBody注解将JSON格式的参数转换成实体对象。

@PostMapping("/parent2")
public String createParent2(@RequestBody Parent parent) {
    // ...

    return "Parent2 created successfully";
}

二、@RequestParam接收的参数校验

对于通过@RequestParam接收的参数进行参数校验时,必须在类上使用@Validated注解,方法参数上加不加@Validated或@Valid都不影响对该方法的参数校验

示例:

@RestController
@Validated
public class ParentController {

	// 方法参数上不加@Validated或@Valid
    @GetMapping("/parent1")
	public String createParent1(@RequestParam("id") @Min(value = 1) Integer id, @RequestParam("size") @Max(value = 10) Integer size) {
	// 业务逻辑处理
    // ...
    return "Parent1 created successfully";
	}
	
	// 方法参数上加@Validated
    @GetMapping("/parent2")
	public String createParent2(@Validated @RequestParam("id") @Min(value = 1) Integer id, @Validated @RequestParam("size") @Max(value = 10) Integer size) {
	// 业务逻辑处理
    // ...
    return "Parent2 created successfully";
	}

	// 方法参数上加@Valid
    @GetMapping("/parent3")
	public String createParent3(@Valid @RequestParam("id") @Min(value = 1) Integer id, @Valid @RequestParam("size") @Max(value = 10) Integer size) {
	// 业务逻辑处理
    // ...
    return "Parent3 created successfully";
	}
}
只要在类上添加了@Validated注解,上面这些方法都会进行参数校验。
如果类上没有添加@Validated注解,就算在方法参数前加@Validated或@Valid也不会进行参数校验。

三、实体对象接收的参数校验

当使用实体对象接收参数进行参数校验时,必须在方法的实体对象参数前添加@Validated或@Valid注解,类上面加不加@Validated都不影响参数的校验

示例:

@RestController
public class ParentController {

	// 使用@Validated对实体对象接收参数进行校验
	@GetMapping("/parent1")
	public String createParent1(@Validated Parent parent) {
    // ...

    return "Parent1 created successfully";
	}
	
	// 使用@Valid对实体对象接收参数进行校验
	@PostMapping("/parent2")
	public String createParent2(@Valid @RequestBody Parent parent) {
    // ...

    return "Parent2 created successfully";
	}
}
只要在方法中的实体对象参数前添加了@Validated或@Valid注解,实体对象中的参数就会进行参数校验,
所在类上加不加@Validated注解都不影响实体对象中的参数校验。

四、既有@RequestParam接收的参数又有实体对象接收的参数方法

对于一个类中存在多种接收参数的方式,那么要想所有方法都实现参数校验的话,那就必须结合上面两种情况,既要在类上添加@Validated注解,又需要在实体对象接收的参数前使用@Validated或@Valid注解,才能使所有方法在调用的使用都先执行参数校验。

@RestController
@Validated
public class TestController {

    // 使用实体对象接收参数,校验直接生效
    @GetMapping("/parent1")
    public String createParent1(@Validated Parent parent) {
        // ...

        return "Parent1 created successfully";
    }

    // 使用实体对象接收参数,校验直接生效
    @PostMapping("/parent2")
    public String createParent2(@Valid @RequestBody Parent parent) {
        // ...

        return "Parent2 created successfully";
    }

    @GetMapping("/parent3")
    public String createParent3(@RequestParam("id") @Min(value = 1) Integer id, @RequestParam("size") @Max(value = 10) Integer size) {
        // 业务逻辑处理
        // ...
        return "Parent3 created successfully";
    }
}

五、总结

  1. 如果使用@RequestParam注解这种方式逐个接收请求参数的话,要想实现参数的校验就必须在类上添加@Validated;
  2. 如果使用实体对象来接收参数的话,要想实现参数的校验就必须在方法的实体对象参数前添加@Validated或@Valid注解;
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值