我们在设计后端API接口的时候,对于前端传输的参数通常是要进行校验的,以保证接口能正确处理数据。

我们可以在代码中,通过if进行条件检测,然后根据检测结果来处理数据

比如这样

if (account == null) {
            throw new Exception("用户名称不能为空");
        }

但是依赖需要验证的代码会很多很杂,写起来也不优雅,所以我们选择用validation库来帮助我们进行字段的校验。

如何使用

第一步,添加依赖

<!--添加validation依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

第二步、在接口中需要验证的对象前添加 @Valid 注解

@PostMapping(value = "")
    public User create(@RequestBody @Valid UserRequestBean bean) {
        return userService.create(bean);
    }

对于验证的对象通过添加注解,进行校验

@Getter
@Setter
public class UserRequestBean {

    @NotNull(message = "用户名不能为空")
    private String username;

    @NotNull(message = "年龄不能为空")
    @Range(min = 18, max = 24, message = "年龄要在18-24之间")
    private Integer age;

    @NotNull(message = "性别不能为空")
    @Range(min = 0, max = 1, message = "性别只能是男1女0")
    private Integer gender;

    @NotEmpty(message = "手机号不能为空")
    @Pattern(regexp = "1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\\d{8}", message = "请输入合法的手机号")
    private String phone;

    private String accessCardNumber;


}

这里用到了几个注解

NotNull 不能为null

Range 范围

NotEmpty 不能为null,也不能trim之后是length为0

Pattern 满足对应的正则表达式

第三步、捕获异常,验证失败的时候统一返回提示信息

捕获参数验证异常 MethodArgumentNotValidException ,并返回数据即可

/**
     * 处理接口请求参数验证异常
     */
    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ErrorResponseBean handleValidException(HttpServletRequest request, MethodArgumentNotValidException exception) {
        StringBuilder message = new StringBuilder();
        List<ObjectError> allErrors = exception.getBindingResult().getAllErrors();
        for (ObjectError error :
                allErrors) {
            if (message.length() > 0) {
                message.append("、");
            }
            message.append(error.getDefaultMessage());
        }
        return createErrorBean(HttpStatus.INTERNAL_SERVER_ERROR.value(), HttpStatus.INTERNAL_SERVER_ERROR.value(), message.toString(), request);
    }

进阶用法

常用注解介绍

除了上面示例介绍的四个注解,还有一些常用注解如下

Null 必须为空

Min 数字最小值

Max 数字最大值

Past 必须为过去的一个日期

Future 必须为将来的一个日期

Length 字符串长度的范围

其他验证

上面例子是对class对象的整体验证,如果是直接传输了一个参数,例如获取列表的搜索字段,直接进行验证,可以直接在Controller中定义规则

@GetMapping
    public Page<User> list(@RequestParam @Min(value = 0, message = "页数最少为0") int page,
                           @RequestParam @Min(value = 1, message = "每页最少条数为1") int size,
                           @RequestParam(required = false) String username,
                           @RequestParam(required = false) Integer maxAge,
                           @RequestParam(required = false) Integer minAge,
                           @RequestParam(required = false) Integer gender,
                           @RequestParam(required = false) String phone,
                           @RequestParam(required = false) String accessCardNumber,
                           @RequestParam(required = false) String orderParam,
                           @RequestParam(required = false) String direction) {
        return userService.list(page, size, username, maxAge, minAge, gender, phone, accessCardNumber, orderParam, direction);
    }

直接使用注解定义要验证的规则就行。要注意的是,需要在这个类上添加一个注解Validated,这样参数中的注解就会生效了。

@Validated
@RestController
@RequestMapping(value = "/user")
public class UserController