springboot validated 数据校验
- 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校验两种方式,具体都写下来来进行对比。本篇就到这里。