1. 使用注解的必要性
在项目的接口定义中,需要对接口的入参做必要的校验,以拦截不合法的请求。简单粗暴的使用if else校验虽然可以达到目的,但是代码看起来会繁琐、冗余,不直观,所以推荐使用注解进行校验,使得代码简单、优雅、方便维护。可以使用现成的校验组件,也可以进行自定义的注解校验。本篇文章主要讲解spring提供的Validated校验使用方式。
注:自定义注解可参考另外一边博文:自定义校验注解
2. 使用方式
2.1 依赖包
<dependency>
<groupId></groupId>
<artifactId>validation-api</artifactId>
<version>1.1.</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.</version>
</dependency>
注:引入spring之后,依赖包是不需要手动引入的
2.2 校验@RequestBody入参
@RestController
public class ValidController {
/**
* 1.对@RequestBody入参进行校验
* 对于@RequestBody的入参,@Validated注解写在ValidController类上是不生效的,必须要写在参数前
* 此处的@Validated可以替换为@Valid
* @param user
* @return
*/
@PostMapping("/api/v1/user")
public String createUser(@Validated @RequestBody User user, BindingResult result) {
if (()) {
().forEach((error) -> {
FieldError fieldError = (FieldError) error;
// 属性
String field = ();
// 错误信息
String message = ();
(field + ":" + message);
});
return "failed";
}
(());
return "create user success";
}
}
@Data
public class User {
@NotNull
@Min(value = 1, message = "id 必须大于0")
@Range(min = 1, max = 100, message = "id 值必须大于0且不大于100")
private Long id;
@NotBlank(message = "name 不能为空")
private String name;
//@Valid注解具有嵌套校验的功能
//此处不能使用@Validated,@Validated不能用在类属性上
@Valid
private Dog dog;
@Getter
@Setter
public static class Dog {
@NotBlank(message = "dog name 不能为空")
private String name;
}
}
需要注意的点:
- 对于@RequestBody的入参,@Validated注解写在ValidController类上是不生效的,必须要写在参数前。可以替换为@Valid。
- 对于入参module中的嵌套类校验,只能使用@Valid,@Validated不可以注解在类的属性字段上;
2.2 校验@RequestParam|@PathVariable入参
@Validated
@RestController
public class ValidController {
/**
* 2.对@RequestParam|@PathVariable入参进行校验
* 为了使得参数校验生效&