当前位置: 首页 > news >正文

springboot中使用Hibernate-Validation

1、说明

后端接口设计时候,需要对前端请求参数进行'先校验后处理业务'情况,如果在业务代码中通过类似if这里逐个校验,会使得代码变得繁琐,开发工作者都是爱偷懒的。java中,Bean ValidationJavaBean的验证定义了相关的元数据模型和API。基于Bean-Validation封装,提供了更加丰富的Hibernate-Validation的校验包。也有开发会把这类校验交给前端来处理,但是接口暴露外网会存在直接调用情况(黄牛)。毕竟:前端校验是为了提高用户的体验度,后端校验则是为了保证数据的安全性

优点
1.验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度
2.统一且规范的验证方式,无需你再次编写重复的验证代码
3.你将更专注于你的业务,将这些繁琐的事情统统丢在一边

2、Bean Validation与Hibernate Validation

2.1 Bean Validation中内置的constraint

包位置路径:javax.validation.constraints

image.png

注解说明
@AssertFalse注释的元素必须为False
@AssertTrue注释的元素必须为True
@Email注释的元素必须邮箱
@NotBlank注释的元素不能为空,!null && size>0
@NotEmpty注释的元素不能为空,数组,集合等
@NotNull注释的元素必须为空,但可以为""字符串
@DecimalMin注释的元素数字,最小不得小于Min
@DecimalMax注释的元素为数字,最大不超过Max值

其中NotNull、NotEmpty、NotBlank区别

  • @NotNull
    适用于基本数据类型(Integer,Long,Double等等),当 @NotNull 注解被使用在 String 类型的数据上,则表示该数据不能为 Null(但是可以为 Empty)
  • @NotBlank
    适用于 String 类型的数据上,加了@NotBlank 注解的参数不能为 Null 且 trim() 之后 size > 0
  • @NotEmpty
    适用于 String、Collection集合、Map、数组等等,加了@NotEmpty 注解的参数不能为 Null 或者 长度为 0
2.1 Hibernate Validation中添加的constraint

image.png

注解说明
@Length注释的元素字符串长度必须为制定返回内
@Range注释的元素必须在指定范围内
@URL注释的元素必须为链接

3、基于Hibernate Validation的实现

(1)pom包引用
查看spring-boot-start-web中已经集成了Hibernate Validation,所以可以不用额外引用包。同时spring-boot-start-validation也完成了Hibernate Validationstart封装(校验机制更加全面)。

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

(2)Bean对象中使用注解注释

... @ApiModelProperty(value = "收货人所在省",required = true) @NotNull(message = "省不能为空") private String recipientProvince; @ApiModelProperty(value = "收货人所在市") @NotNull(message = "市不能为空") private String recipientCity; @ApiModelProperty(value = "收货人所在区") @NotNull(message = "区不能为空") private String recipientDistrict; ...

(3)Controller层使用@Valid或者@Validated

@PostMapping("/add") public UniformResultTemplate<Boolean> addAddress(@RequestBody @Validated AddressReqDto reqDto, HttpServletRequest request){ return null; }

注意:Post请求方式区别,Get@Validated注解需要加在 所在方法类前

@RestController @RequestMapping("/api/address") @Validated public class AddressController extends BaseController{ @ApiOperation("收获地址详情") @GetMapping("/detail") public UniformResultTemplate<AddressDetailRespDto> queryAddressList(@NotNull(message = "地址Id不能为空") @RequestParam(value = "addressId") Long addressId, HttpServletRequest request){ return null; } }

(4)使用@ControllerAdvice统一异常处理返回。

@Component @ControllerAdvice @Slf4j public class GlobalExceptionHandler { // Post请求Bean中的校验抛出:MethodArgumentNotValidException @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public UniformResultTemplate handleBindException(MethodArgumentNotValidException ex) { FieldError fieldError = ex.getBindingResult().getFieldError(); log.warn("参数校验异常:{}({})", fieldError.getDefaultMessage(),fieldError.getField()); return new UniformResultTemplate("10002",fieldError.getDefaultMessage()); } // Get请求的参数校验,抛出的是ConstraintViolationException @ExceptionHandler(ConstraintViolationException.class) @ResponseBody public UniformResultTemplate handleGetBindException(ConstraintViolationException ex) { Set<ConstraintViolation<?>> eSet = ex.getConstraintViolations(); StringBuffer sb = new StringBuffer(); if(!CollectionUtils.isEmpty(eSet)) { Iterator<ConstraintViolation<?>> iterator = eSet.iterator(); while (iterator.hasNext()) { log.warn("参数校验异常:{}({})", iterator.next().getMessage()); sb.append(iterator.next().getMessage()).append("::"); } } return new UniformResultTemplate("10002",sb.toString()); } // 方法签名参数错误 @ExceptionHandler(MissingServletRequestParameterException.class) @ResponseBody public UniformResultTemplate handleGetBindException(MissingServletRequestParameterException ex) { log.warn("参数校验异常:{}", ex.getMessage()); return new UniformResultTemplate("10002",ex.getMessage()); } }

(5)结果现象

{ "code": "10002", "message": "市不能为空", "result": null, "totalTimes": null, "interfaceTimes": null }

4、编译器校验工具

防止因使用错误Hibernate-Validation注解而导致程序运行时报错,增加编译器校验工具,进行友好提示。

<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator-annotation-processor</artifactId> <version>6.1.5.Final</version> </dependency>

AI大模型学习福利

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

http://www.cnnetsun.cn/news/19859.html

相关文章:

  • MethylDackel:BS-seq甲基化提取的终极利器
  • RookieAI_yolov8:2025年游戏AI自瞄技术完全指南
  • pywebview与React集成的终极指南:高效构建跨平台桌面应用
  • 大模型微调:不冻结参数 vs 冻结主干
  • 30亿参数改写AI效率范式:Qwen3-30B-A3B如何让企业AI成本降60%?
  • ppInk:Windows平台上的终极协作写作与在线文档编辑指南
  • 3步彻底解决PDFMathTranslate中文乱码:从新手到专家的终极指南
  • React Stripe.js 终极指南:快速构建安全支付系统
  • 新手专属!BurpSuite 零基础到实战全攻略 —— 渗透测试核心工具配置与精通教程
  • 基于web的农产品溯源系统选题表
  • 基于Web的企业招投标管理系统的开发中期报告
  • ABB RobotWare软件资源下载与配置完全指南
  • Unity角色移动系统终极指南:打造《原神》级流畅体验
  • 终极指南:使用APK Icon Editor轻松定制Android应用
  • 基于Java的学贷通智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 字节跳动开源90亿学术大模型:轻量化英文场景解决方案来了
  • 如何获取119,376个英语单词发音MP3音频资源?实用工具完整指南
  • GitHub下载加速革命:告别龟速访问的终极解决方案
  • cohesive 单元设置粘性(VISCOSITY)
  • AI 内容洞察决策系统:4 大功能让科技企业创新效率提升 50%,敏捷破局信息困局
  • DeepPCB数据集终极指南:PCB缺陷检测实战手册
  • 7-Zip ZS:六种压缩算法如何彻底改变你的文件处理体验
  • Chrome DevTools Protocol终极指南:解锁浏览器自动化的无限可能
  • ET框架客户端性能优化终极指南:从15秒到3秒的快速启动实战
  • 4种有效方法:如何将音乐从Mac传输到Android
  • LoRaWAN智慧物联应用:远距离、低功耗、广连接
  • KK-HF_Patch完整使用指南:轻松解锁游戏无限可能
  • AppPolice终极指南:如何快速限制Mac应用CPU占用
  • 2025 年广州服装批发市场推荐:原创与效率双驱采批标杆
  • 记录vue动态切换访问后台服务