springboot validated注解数据校验 异常处理

Source

springboot validated 数据校验


简单的写一下这个用法啊,清晰的本篇文章就记录这个注解的一个用法。

validated 数据校验

我们一般的数据校验是怎么用的?在常规模式下我们可能就是在前端去通过js去判断?还是在后端重新查找数据库,当然还是有其它的方法,在这里介绍一个注解validated这个注解,我们结合springboot 去使用。这样就容易很多。

首先呢,我们需要在pom中导入这个注解需要的依赖。

这里建议就这样做了。

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

这是和springboot整合起来的这样的一个注解,现在大概就是2.3以上的版本使
用了,我们直接导入这个整合的依赖。导入其他形式的依赖可能会不起作用。

这里展示一个校验,也是比较简单的。
我们这里从登录校验开始说明
我们可以把它用在这里User实体类的接收参数上。 User是我们的实体类,我们用这个实体类修饰的参数来接收前端传来的数据。当然你这里要保证封装的字段和实体类字段一致,当然你也可以进行其它处理。

在这里插入图片描述
然后就去实体类进行一个几个操作。
我们来举例两个,当然这个注解功能还是非常方便的。

在这里插入图片描述
当然我们班也可以去指定邮箱的格式,同样一个字段上可以加多个校验注解。
在这里插入图片描述
其他的自己去查找就是了,这里只是说明一下使用的方法。
我们加了校验注解后,如何去配合使用呢?

我们可以去做一个全局异常捕获的处理类,当然怎么样封装我们可以自己去做。

代码如下

package jgdabc_.ExceptionHander;

import jgdabc_.common.R_;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
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 org.springframework.web.bind.annotation.ResponseStatus;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @author 兰舟千帆
 * @version 1.0
 * @date 2022/12/9 21:06
 */
@ControllerAdvice(annotations = Controller.class)
@Slf4j
//做一个捕获参数校验异常的类
public class GlobalDefaultExceptionHandler {
    
      
    private static final Logger logger = LoggerFactory.getLogger(GlobalDefaultExceptionHandler.class);
    //捕获校验失败的异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    //设置响应状态码,当然这里其实我并没有用上,我自己在R_对象封装了
    @ResponseStatus(HttpStatus.OK)
    public R_ handleParamCheckExcepion(HttpServletRequest req, MethodArgumentNotValidException ex) {
    
      
    //那下面这里就是读取具体的校验失败的数据了,可能不是一个,所以其实有一个遍历的过程。
        BindingResult bindingResult = ex.getBindingResult();
        StringBuilder paramErrorMsg = new StringBuilder();
        if (bindingResult.hasErrors()) {
    
      

            List<ObjectError> allErrors = bindingResult.getAllErrors();
            for (ObjectError objectError : allErrors) {
    
      
                String msg = objectError.getDefaultMessage();
                if (paramErrorMsg.length() == 0) {
    
      
                    paramErrorMsg.append(msg);
                } else {
    
      
                    paramErrorMsg.append(',');
                    paramErrorMsg.append(msg);
                }
            }
        }
        //这里我们输出了错误的日志
        logger.error("参数校验失败! uri:{},错误信息:{}", req.getRequestURI(), paramErrorMsg.toString());
        //这里我用R_对象去封装返回了
        return R_.error(paramErrorMsg.toString());
    }
}

R_实体是做的一个实体封装类,其实是一个泛型类。泛型的方便指出在这里可以体现出来。来看R_。一直在用这个,作为工具类很方便嘿嘿。

package jgdabc_.common;

import lombok.Data;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

//通用返回结果,这里其实就是一个泛型封装类
@Data
public class R_<T>implements Serializable {
    
      

    private Integer code; //编码:1成功,0和其它数字为失败

    private String msg; //错误信息

    private T data; //数据

    private Map map = new HashMap(); //动态数据
//这样的泛型设计非常巧妙了
    public static <T> R_<T> success(T object) {
    
      
        R_<T> r = new R_<T>();
        r.data = object;//这里可以接收到返回的值
        r.code = 1;
        return r;
    }

    public static <T> R_<T> error(String msg) {
    
      
        R_ r = new R_();
        r.msg = msg;
        r.code = 0;
        return r;
    }

    public R_<T> add(String key, Object value) {
    
      
        this.map.put(key, value);
        return this;
    }

}

前台我们直接这样取就可以了。当然前端怎么写自己可以搞,我们具体的逻辑就是这样。
在这里插入图片描述
在这里插入图片描述

这里啊,其实就是直接从这里来捕获校验了。在这里接收封装参数校验后,出现校验问题的话,会直接跑到异常捕获里面,并不会执行方法内部的·1逻辑,其实这里响应也是比较快的。
在这里插入图片描述

ok,后面追加一篇登录注册校验的逻辑,我们用注解校验和前端js校验两种方式,具体都写下来来进行对比。本篇就到这里。