SpringMVC之参数验证

SpringMVC之参数验证

一、为什么使用参数验证

以下面的登录接口为例,需要手动去验证参数是否存在,这种写法繁琐且不太优雅。

@RestController
public class LoginController {

    @RequestMapping("/login")
    public String test(@RequestBody User user){
        if(user.getUserName()!=null && user.getPassword()!=null){
            //查数据库验证逻辑省略
            System.out.println(user);
            return "登录成功";
        }else{
            return "参数不能为null";
        }
    }
}    

1.1、参数验证作用

为了简化代码,所以首先来进行参数验证。

二、怎么使用参数验证

        <!-- spring-boot 2.3及以上的版本需要引入包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

2.1、小结

有针对于数字、邮箱、时间、正则、对象(集合、字符串、布尔类型)

三、具体操作流程

3.1、在pojo类中添加需要使用的注解

以添加用户接口为例,验证提交的数据并对@Valid注解对UserDetail 对象里属性进行嵌套校验。

public class User {

    @NotBlank
    private String userName;

    @NotBlank
    @Length(min = 6,max = 12)
    private String password;

    @Valid
    @NotNull(message = "不能为空")
    private UserDetail userDetail;
	//省略get set 方法
}
public class UserDetail {

    @NotBlank
    private String address;
 
    @Max(60)
    @Min(18)
    @NotNull
    private Integer age; 
    //省略get set 方法
}    

3.2、在接口入参处添加@Valid

    @PostMapping("/save")
    public String loginValid(@Valid @RequestBody User user){
        System.out.println(user);
        return "保存成功";
    }

3.3、添加全局异常处理类返回校验错位提示信息

@ControllerAdvice
public class ControllerException {

    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Object handleValidException(MethodArgumentNotValidException e) {
        //将错误信息返回给前台
        String field, msg;
        StringBuilder sb = new StringBuilder();
        for (FieldError fieldError : e.getBindingResult().getFieldErrors()) {
            // 获取错误验证字段名
            field = fieldError.getField();
            msg = fieldError.getDefaultMessage();
            sb.append("参数名[").append(field).append("]").append(msg).append(",");
        }
        sb.deleteCharAt(sb.length() - 1);
        return sb.toString();
    }

}

3.4、测试

测试接口,可以看到添加的校验规则都生效了。

posted @ 2022-10-09 17:26  写的代码很烂  阅读(466)  评论(0编辑  收藏  举报