校验注解

时间:2025-03-11 07:27:35

 

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;
    }
}

需要注意的点:

  1. 对于@RequestBody的入参,@Validated注解写在ValidController类上是不生效的,必须要写在参数前。可以替换为@Valid。
  2. 对于入参module中的嵌套类校验,只能使用@Valid,@Validated不可以注解在类的属性字段上;

2.2 校验@RequestParam|@PathVariable入参

@Validated
@RestController
public class ValidController {
    /**
     * 2.对@RequestParam|@PathVariable入参进行校验
     * 为了使得参数校验生效&