Spring Boot 参数校验及异常统一处理

1、@Validated参数校验

【1】:实体类dto

package com.cc.common.dto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.List;
import java.util.Set;

/**
 * 用户入参dto
 * @author cc
 * @data 2021年06月29日 21:27
 */
@Data
public class UserDto {

    private Long id;

    @NotBlank(message = "姓名不可为空", groups = Set.class)
    private String name;

    @NotBlank(message = "密码不可为空", groups = List.class)
    private String passWord;

    private String token;

}

【2】:Controller中@Valid表示这个实体参数交给Spring去校验

@RequestMapping("/login")
public ReturnVo login(@RequestBody @Validated({Set.class, List.class}) UserDto dto){
    ReturnVo login = loginService.login(dto);
    return login;
}

【3】:校验规则

注解解释
@Null被注释的元素必须为 null
@NotNull被注释的元素必须不为 null
@NotEmpty验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank验证注解的元素值不为空(不为null并去除首尾位空格)
@AssertFalse被注释的元素必须为 false
@AssertTrue被注释的元素必须为 true
@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Email被注释的元素必须是电子邮箱地址
@Future被注释的元素必须是一个将来的日期
@Past限制必须是一个过去的日期
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Pattern(value)限制必须符合指定的正则表达式
@Size(max,min)限制字符长度必须在min到max之间

2、异常统一校验

【1】:使用@ControllerAdvice和@ExceptionHandler注解, 注解@ControllerAdvice表示这是一个控制器增强类,当控制器发生异常且符合类中定义的拦截异常类,将会被拦截。

示例

package com.cc.common.component.exceptionHandler;

import com.cc.common.utils.ReturnVoUtil;
import com.cc.common.vo.ReturnVo;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;

/**
 * @author cc
 * @data 2021年07月03日 14:37
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 参数校验统一返回
     * @author cc
     * @date 2021/7/3 14:40
     */
    @ResponseBody
    @ExceptionHandler({MethodArgumentNotValidException.class})
    public ReturnVo parameterExceptionHandler(MethodArgumentNotValidException e){
        e.printStackTrace();
        StringBuffer msg = new StringBuffer();
        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
        for (FieldError fieldError : fieldErrors) {
            msg.append(fieldError.getDefaultMessage()).append(" ");
        }
        return ReturnVoUtil.error(msg.toString());
    }
}

【2】:使用ErrorController类来实现。具体不做讲解。请自行百度

区别:

1.注解@ControllerAdvice方式只能处理控制器抛出的异常。此时请求已经进入控制器中。

2.类ErrorController方式可以处理所有的异常,包括未进入控制器的错误,比如404,401等错误

3.如果应用中两者共同存在,则@ControllerAdvice方式处理控制器抛出的异常,类ErrorController方式未进入控制器的异常。

4.@ControllerAdvice方式可以定义多个拦截方法,拦截不同的异常类,并且可以获取抛出的异常信息,自由度更大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cc_南柯一梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值