您的当前位置:首页正文

Springboot使用@Validated校验参数必坑

2024-11-29 来源:个人技术集锦

springboot2.3.0版本以上,必须添加依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

1.controller层

/**
     * 登录功能
     * @param loginForm 登录参数,包含手机号、验证码;或者手机号、密码
     */
    @PostMapping("/login")
    public Result login(@RequestBody @Validated LoginFormDTO loginForm, HttpSession session){
        // TODO 实现登录功能
        return userService.login(loginForm,session);
    }

2.请求体

@Data
public class LoginFormDTO {

    @NotEmpty(message = "手机号码不能为空")
    @Pattern(regexp = "^[1][3,4,5,7,8,9][0-9]{9}$", message = "手机号码不合法")
    private String phone;

    @NotEmpty(message = "验证码不能为空")
    @Size(min = 6,max = 6)
    private String code;

    private String password;

}

3.全局异常

@ControllerAdvice
public class GlobalExceptionHandler {


    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    public Result argumentException(MethodArgumentNotValidException exception) {
        String resut = "";
        //查看MethodArgumentNotValidException类可以发现,异常的信息在BindingResult下List<ObjectError>中
        //我这里取第一条的信息进行展示,可根据实际项目情况自行修改
        //getDefaultMessage()获取的信息就是我们RequestVerificationCode中的message部分
        if (exception.getBindingResult() != null
                && exception.getBindingResult().getAllErrors() != null
                && exception.getBindingResult().getAllErrors().size() > 0) {
            resut = exception.getBindingResult().getAllErrors().get(0).getDefaultMessage();
        }
        //自定义的返回类,可根据实际项目情况自行修改
       return Result.fail(resut);
    }


    /**
     * 全局捕获异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result handle(Exception e) {
        return Result.fail(e.getMessage());
    }
}

注意:正则表达式一定要正确

请求体的成员属性包含其他对象,在其他对象上加注解@Valid

显示全文