我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【Spring 校验】

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【Spring 校验】


在这里插入图片描述

主页传送门:📀 传送

🍇 概述


  Java API 规范(JSR303)定义了Bean校验的标准validation-api,但没有提供具体的实现方法。hibernate validation是对这个规范的实现,并增加了如@Email@Length等校验注解。Spring Validation是对hibernate validation的二次封装,用于支持spring mvc参数的自动校验。

🍉 使用场景

Spring 校验使用场景

  • Spring 常规校验(Validator)
  • Spring 数据绑定(DataBinder)
  • Spring Web 参数绑定(WebDataBinder)
  • Spring WebMVC/WebFlux 处理方法参数校验

🍉 依赖引入


  如果 spring-boot 版本小于 2.3.x,spring-boot-starter-web 会自动传入 hibernate-validator 依赖。如果 spring-boot 版本大于 2.3.x,则需要手动引入依赖:

  org.hibernate.validator  hibernate-validator-parent  6.2.5.Final

  对于 web 服务来说,为防止非法参数对业务造成影响,在 Controller 层一定要做参数校验的!大部分情况下,请求参数分为如下两种形式:

  • POST、PUT 请求,使用 requestBody 传递参数;
  • GET 请求,使用 requestParam/PathVariable 传递参数。

  实际上,不管是 requestBody 参数校验还是方法级别的校验,最终都是调用 Hibernate Validator 执行校验,Spring Validation 只是做了一层封装。

🍍 校验示例


🍈(1)在实体上标记校验注解

示例

@Data@NoArgsConstructor@AllArgsConstructorpublic class User implements Serializable {    @NotNull    private Long id;    @NotBlank    @Size(min = 2, max = 10)    private String name;    @Min(value = 1)    @Max(value = 100)    private Integer age;}

  上述类使用了Lombok库的@Data、@NoArgsConstructor和@AllArgsConstructor注解,分别用于自动生成getter、setter、无参构造方法和全参构造方法

🍒(2)在方法参数上声明校验注解

@Slf4j@Validated@RestController@RequestMapping("validate1")public class ValidatorController {        @PostMapping(value = "save")    public DataResult save(@Valid @RequestBody User entity) {        log.info("保存一条记录:{}", JSONUtil.toJsonStr(entity));        return DataResult.ok(true);    }        @GetMapping(value = "queryByName")    public DataResult queryByName(        @RequestParam("username")        @NotBlank        @Size(min = 2, max = 10)        String name    ) {        User user = new User(1L, name, 18);        return DataResult.ok(user);    }        @GetMapping(value = "detail/{id}")    public DataResult detail(@PathVariable("id") @Min(1L) Long id) {        User user = new User(id, "李四", 18);        return DataResult.ok(user);    }}

  上述类ValidatorController,使用了Spring框架。它是一个RESTful风格的控制器,用于处理HTTP请求。这个类有三个方法:

  • save方法:使用@PostMapping注解,处理POST请求,路径为"validate1/save"。该方法接收一个User类型的参数entity,使用@Valid和@RequestBody注解进行参数校验。如果校验通过,将记录保存到数据库,并返回一个表示成功的DataResult对象。

  • queryByName方法:使用@GetMapping注解,处理GET请求,路径为"validate1/queryByName"。该方法接收一个名为username的请求参数,使用@NotBlank、@Size注解进行参数校验。如果校验通过,根据name查询用户信息,并返回一个包含用户信息的DataResult对象。

  • detail方法:使用@GetMapping注解,处理GET请求,路径为"validate1/detail/{id}"。该方法接收一个名为id的路径变量,使用@Min注解进行参数校验。如果校验通过,根据id查询用户信息,并返回一个包含用户信息的DataResult对象。

🍏(3)抛异常

  如果请求参数不满足校验规则,则会抛出ConstraintViolationExceptionMethodArgumentNotValidException异常。

🥝 异常统一处理

  在实际项目开发中,通常会用统一异常处理来返回一个更友好的提示。

@Slf4j@ControllerAdvicepublic class GlobalExceptionHandler {        @ResponseBody    @ResponseStatus(HttpStatus.OK)    @ExceptionHandler(Throwable.class)    public Result handleException(Throwable e) {        log.error("未知异常", e);        return new Result(ResultStatus.HTTP_SERVER_ERROR.getCode(), e.getMessage());    }        @ResponseBody    @ResponseStatus(HttpStatus.BAD_REQUEST)    @ExceptionHandler({ ConstraintViolationException.class })    public Result handleConstraintViolationException(final ConstraintViolationException e) {        log.error("ConstraintViolationException", e);        List errors = new ArrayList<>();        for (ConstraintViolation violation : e.getConstraintViolations()) {            Path path = violation.getPropertyPath();            List pathArr = StrUtil.split(path.toString(), ',');            errors.add(pathArr.get(0) + " " + violation.getMessage());        }        return new Result(ResultStatus.REQUEST_ERROR.getCode(), CollectionUtil.join(errors, ","));    }        @ResponseBody    @ResponseStatus(HttpStatus.BAD_REQUEST)    @ExceptionHandler({ MethodArgumentNotValidException.class })    private Result handleMethodArgumentNotValidException(final MethodArgumentNotValidException e) {        log.error("MethodArgumentNotValidException", e);        List errors = new ArrayList<>();        for (ObjectError error : e.getBindingResult().getAllErrors()) {            errors.add(((FieldError) error).getField() + " " + error.getDefaultMessage());        }        return new Result(ResultStatus.REQUEST_ERROR.getCode(), CollectionUtil.join(errors, ","));    }}

  上述全局异常处理器类,用于处理控制器中抛出的异常。这个类有三个方法:

  • handleException方法:使用@ResponseBody、@ResponseStatus和@ExceptionHandler注解,处理所有不可知的异常。如果发生异常,记录错误日志,并返回一个表示服务器错误的Result对象。

  • handleConstraintViolationException方法:使用@ResponseBody、@ResponseStatus和@ExceptionHandler注解,统一处理请求参数校验异常(普通传参)。如果发生ConstraintViolationException异常,记录错误日志,将异常信息转换为字符串列表,并返回一个表示请求错误的Result对象。

  • handleMethodArgumentNotValidException方法:使用@ResponseBody、@ResponseStatus和@ExceptionHandler注解,处理参数校验异常。如果发生MethodArgumentNotValidException异常,记录错误日志,将异常信息转换为字符串列表,并返回一个表示请求错误的Result对象。

在这里插入图片描述

  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论  你的支持就是我✍️创作的动力!  💞💞💞

来源地址:https://blog.csdn.net/wodejiaAA/article/details/132015448

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【Spring 校验】

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【Spring 校验】

校验 🍇 概述🍉 使用场景🍉 依赖引入 🍍 校验示例🍈(1)在实体上标记校验注解🍒(2)在方法参数上声明校验注解🍏(
2023-08-17

详解spring注解式参数校验

一般入参我们都会转为vo对象。那么直接在对象的属性上注解即可。 其实spring用的是hibernate的validator.步骤1.配置spring.xml
2023-05-31

spring注解校验原理是什么

这篇文章主要介绍“spring注解校验原理是什么”,在日常操作中,相信很多人在spring注解校验原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”spring注解校验原理是什么”的疑惑有所帮助!接下来
2023-06-17

Spring Validation怎么实现数据校验

这篇文章主要讲解了“Spring Validation怎么实现数据校验”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Validation怎么实现数据校验”吧!一、什么是 Spr
2023-07-05

Spring Boot项目传参校验的方法

这篇文章主要讲解了“Spring Boot项目传参校验的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Boot项目传参校验的方法”吧!场景还原简单业务场景模拟:假如你现在在
2023-06-29

Spring Validation实现数据校验的示例

Spring Validation其实就是对Hibernate Validator进一步的封装,方便在Spring中使用,这篇文章主要介绍了Spring Validation实现数据校验的示例,需要的朋友可以参考下
2023-03-06

vue+spring boot如何实现校验码功能

这篇文章将为大家详细讲解有关vue+spring boot如何实现校验码功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。用vue写了一个校验码来玩玩,样子如下:1.img标签
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录