springboot validated注解数据校验 异常处理
创始人
2024-04-20 12:55:38

springboot validated 数据校验

  • validated 数据校验

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

validated 数据校验

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

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

这里建议就这样做了。

  org.springframework.bootspring-boot-starter-validation

这是和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 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_implements Serializable {private Integer code; //编码:1成功,0和其它数字为失败private String msg; //错误信息private T data; //数据private Map map = new HashMap(); //动态数据
//这样的泛型设计非常巧妙了public static  R_ success(T object) {R_ r = new R_();r.data = object;//这里可以接收到返回的值r.code = 1;return r;}public static  R_ error(String msg) {R_ r = new R_();r.msg = msg;r.code = 0;return r;}public R_ add(String key, Object value) {this.map.put(key, value);return this;}}

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

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

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

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...