Spring Boot使用JSR-380进行校验

JSR 380 Java Bean 验证标准草案介绍 文章目录前言下载安装功能验证 Java Bean验证方法参数验证集合内容多字段联合验证自定义验证与 Spring 结合总结 前言 使用 Java 编写接口时,我们经常需要验证参数的合法性,但是在标准出现之前,我们有各种各样的方法用来验证,比如编写断言工具类等。后来 Java 发展出了一套非常方便的验证框架,最开始作为 JSR 303 规范,后来进行了拓展,叫做 JSR 380,其说明可在 https://jcp.org/en/jsr/detail?id=380 查看。虽然叫做提案,但是已经非常完善了。 下载 阅读详情

介绍

JSR-380是 J2EE 的一个规范,用于校验实体属性,它是JSR-303的升级版,在 Spring Boot 中可以基于它优雅实现参数校验。

示例

在没有使用JSR-380之前,我们一般都会将参数校验硬编码在controller类中,示例:

public Result add(@RequestBody User user){
    if(StringUtils.isBlank(user.getName())){
        return Result.error("用户名不能为空");
    }
    // ...
}

而使用JSR-380只需要通过添加对应的注解即可实现校验,示例:

@Data
public class User{
    @NotBlank
    private String name;
    private Integer age;
}

public Result register(@Validated @RequestBody User user){
    // ...
}

这样看起来代码是不是清爽了很多,只需要在需要校验的字段上加上对应的校验注解,然后对需要校验的地方加上@Validated注解,然后框架就会帮我们完成校验。

通过全局异常自定义错误响应

框架校验失败之后会抛出异常,需要捕获这个异常然后来自定义校验不通过的错误响应,这里直接贴代码,兼容@RequestBody、@ModelAttribute、@RequestParam三种入参的校验:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = {MethodArgumentNotValidException.class, BindException.class})
    public ResponseEntity<Result> methodArgumentNotValidHandler(HttpServletRequest request, Exception e) {
        BindingResult bindingResult;
        if (e instanceof MethodArgumentNotValidException) {
            //@RequestBody参数校验
            bindingResult = ((MethodArgumentNotValidException) e).getBindingResult();
        } else {
            //@ModelAttribute参数校验
            bindingResult = ((BindException) e).getBindingResult();
        }
        FieldError fieldError = bindingResult.getFieldError();
        return ResponseEntity.ok(Result.fail(Result.CODE_PARAMS_INVALID, "[" + fieldError.getField() + "]" + fieldError.getDefaultMessage()));
    }

    //@RequestParam参数校验
    @ExceptionHandler(value = {ConstraintViolationException.class, MissingServletRequestParameterException.class})
    public ResponseEntity<Result> constraintViolationHandler(Exception e) {
        String field;
        String msg;
        if (e instanceof ConstraintViolationException) {
            ConstraintViolation<?> constraintViolation = ((ConstraintViolationException) e).getConstraintViolations().stream().findFirst().get();
            List<Path.Node> pathList = StreamSupport.stream(constraintViolation.getPropertyPath().spliterator(), false)
                    .collect(Collectors.toList());
            field = pathList.get(pathList.size() - 1).getName();
            msg = constraintViolation.getMessage();
        } else {
            // 这个不是JSR标准返回的异常,要自定义提示文本
            field = ((MissingServletRequestParameterException) e).getParameterName();
            msg = "不能为空";
        }
        return ResponseEntity.ok(Result.fail(Result.CODE_PARAMS_INVALID, "[" + field + "]" + msg));
    }
}

然后再访问一下接口,可以看到错误提示已经按自定义的规范显示了:

可以看到都不需要写任何提示文本就可以完成校验和提示,上图的不能为空是框架内置的I18N国际化支持,每个注解都内置相应的提示模板。

常用校验注解

注解描述
@NotNull验证值不为 null
@AssertTrue验证值为 true
@Size验证值的长度介于 min 和 max 之间,可应用于 String、Collection、Map 和数组类型
@Min验证值不小于该值
@Max验证值不大于该值
@Email验证字符串是有效的电子邮件地址
@NotEmpty验证值不为 null 或空,可应用于 String、Collection、Map 和数组类型
@NotBlank验证字符串不为 null 并且不是空白字符
@Positive验证数字为正数
@PositiveOrZero验证数字为正数(包括 0)
@Negative验证数字为负数
@NegativeOrZero验证数字为负数(包括 0)
@Past验证日期值是过去
@PastOrPresent验证日期值是过去(包括现在)
@Future验证日期值是未来
@FutureOrPresent验证日期值是未来(包括现在)

 

Java开发者的噩梦:如何彻底解决NullPointerException?从Optional到JSR 380的终极方案 是 Java 中常见且令人头疼的异常之一,但通过一系列现代化的工具和技术,我们可以显著减少 NPE 的发生。通过合理使用Optional、JSR 380(Bean Validation 2.0)以及现代的注解和代码分析工具,我们能够在编写 Java 应用时更加严谨地处理null的问题,从而提高代码的可维护性和可靠性。使用Optional来明确表示一个值的存在或缺失,减少传统的null判断。使用 JSR 380 提供的验证注解,确保对象的字段在创建时有效。 阅读详情

相关推荐

Spring Boot参数校验避坑指南:从入门到精通

本文全面介绍了SpringBoot参数校验的最佳实践。主要内容包括:1)基础用法:讲解JSR-380规范的核心注解使用,如@NotBlank、@Size等;2)进阶场景:分组校验、嵌套校验和自定义校验的实现方案;3)避坑指南:总结10个常见问题,包括校验注解混用、全局异常处理等。文章通过完整代码示例,帮助开发者掌握参数校验的关键技术,提升接口健壮性。

qq_55253420的博客 1057

JSR380(Bean Validation 2.0)

1、新的变化 支持验证容器元素 集合类型的级联验证。 支持java.util.Optional 支持JavaFX的属性类型 支持自定义容器类型 支持新的日期/时间类型 新的内置约束:@Email, @NotEmpty, @NotBlank, @Positive, @PositiveOrZero, @Negative, @NegativeOrZero, @PastOrPresent, @FutureOrPresent 所有内置约束现在都标记为可重复 通过反向获取参数名字 Constrain.

多看多听多总结 806

hibernate-validator, Hibernate验证器Bean验证 2.0 ( JSR 380 ) 参考实现.zip

hibernate-validator, Hibernate验证器Bean验证 2.0 ( JSR 380 ) 参考实现 Hibernate 验证器版本:6.0.2. Final - 22-08-2017是什么?这是 JSR-380 Bean验证 2.0的参考实现。 Bean验证定义了JavaBean的元数据模型和API以及方法验证。 默认元数据源是注

JSR380验证框架

validat @NotNull 论证注解的属性值不是空的。 @AssertTrue 验证注解的属性值是否为真。 @Size 验证注解的属性值的大小介于属性min和max之间;可应用于string,collection,map和数组属性。 @Min 验证注解属性的值不小于值属性的值 @Max 验证被注解的属性的值不大于值属性的值 @Email 验证注解的属性是一个有效的电子邮件地址。 @Pattern 验证注解的属性是否匹配正则表达式 @NotEmpty 验证属性不是空或空;可以应用于stri

m0_46561911的博客 1348

vavr-beanvalidation2:用于vavr的Bean验证模块-与任何JSR380提供程序集成

Vavr-Beanvalidation 2.0 此模块提供对bean验证2.0(JSR380)的支持。 可以与bean验证规范的任何服务提供者一起使用,例如org.hibernate.validator:hibernate-validator 添加了验证: @Size的Traversable<T> @Size @NotEmpty表示vavr的Value<T> 所有可用的验证都可以应用于嵌套的元组值。 见下面的例子 使用模块 将依赖项添加到您的类路径中。 对于行家: < dependency> < groupId>io.vavr</ groupId> < artifactId>vavr-beanvalidation2</ artifactId> < version>0.9.2</ version> </ dependency> 为了使bea

如何使用安路TD与Modelsim进行联合仿真?

1)安装安路FPGA开发软件;(本次实验使用版本:TD_5.6.3_Release)2)安装Modelsim仿真软件;(本次实验使用版本:Modelsim SE-64 10.1c)3)FPGA开发板;(本次实验使用型号:EG4X20BG256)4)LED点灯例程;

qq_17313923的博客 3212

java bean 验证——JSR 380

java bean 验证——JSR 380 概述 本文快速浏览下java bean验证的基础知识,使用jsr380标准框架,也就是Bean validation2.0 。 验证用户输入,在大多数应用中是最常用的需求,java bean 验证框架已经称为处理这方面逻辑的实时标准。 JSR 380 JSR 380规范是bean验证的java api规范,javaEE和javaSE的一部分...

neweastsun的专栏 5342

QEMU pcie config空间访问机制

而pci_host_conf/data_le_ops的定义是在hw/pci/pci-host.c里,对于0xCF8端口的处理,因为是地址选通,所以只需要在write的时候记录、read的时候返回记录的值即可。而pci_host_config_write/read_common接口,在前256Bconfig空间的模拟中,也同样是会调用这个接口,所以后续的处理都是一样的。这是真实的硬件设计,而对于QEMU+KVM的虚机场景,显然是要基于硬件实现和虚拟化的需求设计虚机访问config空间的完整流程。

leiyanjie8995的博客 1949

JavaWeb27-Spring Boot:接口参数校验(JSR-380 注解与自定义校验)

摘要 Spring Boot 集成 JSR-380 规范,通过注解实现声明式参数校验,大幅提升开发效率与系统健壮性。本文系统讲解: 基础校验:@NotBlank、@Size等内置注解应用 嵌套校验:@Valid注解处理复杂对象层级 分组校验:@Validated实现不同场景的校验规则 自定义校验:开发业务特定的验证逻辑 全局异常处理:统一返回格式的错误响应 包含完整代码示例,帮助开发者构建安全的API接口,替代冗余的if-else校验逻辑,实现业务逻辑与参数校验的有效解耦。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Altium Designer实战:手把手教你设计智能车竞赛疯狂电路组赛道(附封装库)

本文详细介绍了使用Altium Designer软件进行智能车竞赛“疯狂电路”组赛道设计的全流程实战指南。从理解比赛规则、搭建设计环境、创建专用元器件封装库,到电路布局、路径规划及设计输出验证,手把手教你高效完成符合计分标准的赛道图纸设计,并附上实用的封装库管理方法。

alice7model的博客 1320

1、STVD和STVP的使用及串口烧写程序教程

文章目录一、前述二、STVD的使用三、STVP的使用1、STVP的作用:2、STVP的使用四、串口烧录程序 一、前述 STVD是意法半导体推出的,可以支持STM8和STM32 而IAR不尽如此,还支持51,MSP430等芯片 软件开发环境:编写程序,调试软件功能,下载固件到单片机中 硬件开发环境:连接外围电路,驱动功能外设,实现电气功能 最终构成一个以STM8系列单片机作为控制核心的应用系统。 MCS-51 一般的开发环境是 IAR 和 Keil STM8 一般的开发环境是 IAR 和 ST

Clichong 1万+

Spring Boot 参数校验全局处理(JSR380 + 自定义校验)

JSR380提供的默认注解,只能满足基础的参数校验场景,而在实际开发中,经常会遇到一些特殊的校验需求(如手机号格式、身份证号、邮政编码等),此时@Pattern注解虽然可以实现,但正则表达式分散在各个字段上,无法复用,且代码可读性差。通过自定义校验注解,可将特殊的校验逻辑封装起来,实现校验逻辑的复用,同时让代码更简洁、更规范。下面以“手机号格式校验”为例,详细讲解自定义校验注解的实现步骤,其他特殊场景可参考此步骤仿写。

码客日记的博客 619

C语言面试,8道一定会遇到的----关于指针的笔试题详解

C语言面试,8道一定会遇到的----关于指针的笔试题详解

m0_55322924的博客 462

Spring Boot使用JSR-380进行校验-validation

Spring Validation是对hibernate validation的二次封装,用于支持spring mvc参数自动校验。接下来,我们以spring-boot项目为例,介绍Spring Validation的使用。Java API规范(JSR303)定义了Bean校验的标准validation-api,但没有提供实现。hibernate validation是对这个规范的实现,并增加了校验注解如@Email、@Length等。

飘然渡沧海的博客 434

pyecharts可视化图表-tree:从入门到精通

本文系统介绍了树图(Tree Chart)的可视化技巧,包含基础实现、方向定制和环形布局等实例。树图能清晰展示层次结构数据,适用于组织架构、文件系统等场景。教程详细解析了pyecharts树图的核心配置项,包括数据准备、方向设置(下上、右左)和样式定制,并提供了完整代码示例。通过本指南,读者可快速掌握专业树图的构建方法,实现复杂层次数据的可视化呈现。

大数据内容个人总结与分享 1970

matlab 点云可视化(1)——pcshow()函数可视化单个点云

matlab可视化单个点云常用方法汇总。

点云侠的博客 5357

JSR380+全局异常处理:Spring Boot参数校验实战指南

在Java Web开发中,参数校验是保障接口健壮性的基础环节。传统的Controller层if判断不仅造成代码冗余,更让校验规则难以维护。JSR380(Bean Validation 2.0)作为标准规范,通过声明式注解将校验逻辑从业务代码中剥离,配合Spring Boot的全局异常处理机制,能够将校验失败统一转化为清晰的JSON响应。本文从实际项目中的校验痛点切入,系统梳理JSR380核心注解的适用场景与常见陷阱,深入解析分组校验、嵌套校验在真实业务中的落地方式,并完整演示自定义校验注解从定义到生效的三步

weixin_34098209的博客 271

ESP32 WIFI 智能巡线小车设计与实现(四足 / 四轮通用)

本文设计的 ESP32 WIFI 智能巡线小车,硬件模块化、软件轻量化,兼容四足与四轮两种结构,实现了自动巡线与 WIFI 远程控制双功能。系统成本低、易上手,适合嵌入式初学者学习 WIFI 通信、传感器应用、运动控制等核心知识点,也可在此基础上扩展蓝牙控制、避障、视觉识别等功能。

weixin_42300449的博客 151

Spring Boot中常用的JSR 380参数校验注解

验证对象值不应为 null。: 验证布尔值是否为 true。: 验证布尔值是否为 false。验证数字是否不小于指定的最小值。验证数字是否不大于指定的最大值。验证数字值(可以是浮点数)是否不小于指定的最小值。验证数字值(可以是浮点数)是否不大于指定的最大值。验证数字值是否为正数。验证数字值是否为正数或零。验证数字值是否为负数。验证数字值是否为负数或零。验证元素(如字符串、集合或数组)的大小是否在给定的最小值和最大值之间。验证数字是否在指定的位数范围内。例如,可以验证一个数字是否有两位整数和三位小数。

JunDong的博客 731

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JSR 380和注解优雅地实现后端参数的校验

JSR 380和注解优雅地实现后端参数的校验背景一、引入注解二、使用JSR 380注解三、使用自定义注解开发校验注解四、开发基于对象的多字段校验的注解(校验密码和校验密码是否相同) 背景 一、引入注解 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation&l

摩羯座de杰杰陆的博客 660

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

什么是java的JSR 380?

JSR 380 是 Java 生态中参数校验的 “标准方案”,通过标准化注解 + 自动校验,解决了重复校验、规则不统一的问题,是服务间通信(如 Feign 调用)、接口参数校验的必备工具,配合 Spring Boot 可快速集成使用。

2201_75355172的博客 1200

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

spring boot中@Validated

在 Spring Boot 中,@Validated 是用于触发参数校验的注解,通常与 ​​JSR-303/JSR-380​​(Bean Validation)提供的校验注解一起使用。

qq_38923350的博客 1366

Spring Boot - 参数校验:分组校验、自定义注解、嵌套对象全解析

Spring Boot - 参数校验:分组校验、自定义注解、嵌套对象全解析

weixin_46619605的博客 1277

Spring Boot参数校验实战指南

Spring Boot 提供了多种方式校验前端传递的参数,包括 JSR-303/JSR-380 标准注解、自定义校验器以及手动校验。以下是具体实现方法。在实体类或 DTO 上添加校验注解,配合。在 Controller 中通过。通过定义分组接口实现不同场景下的。

PxX_bo9n的博客 168

【BeanValidation】一、springboot项目以注解方式实现后端数据验证(javax.validation.api与hibernate-validator)

1 引言 1.1 场景 最近的这个项目是互联网项目,网络用户需要填写表单信息保存提交。页面输入信息需要进行数据格式校验,从而避免无效数据被保存或者提交。这些检查工作包括必填项检查、数值检查、长度检查、身份证号码、手机号码检查等工作。如果将这些字段校验和业务逻辑混合一起写,则会干扰原有逻辑,而且不容易维护。下面即将要介绍的是后端api对表单数据的验证处理技术。 1.2 名词或技术介绍 (1) JSR...

木子叶的奔跑 7284

Hibernate Validator 数据校验框架

JSR:Java Specification Requests的缩写,意思是Java规范提案是指向JCP(Java Community Process) 提出新增一个标准化技术规范的正式请求任何人都可以提交JSR,以向Java平台增添新的API和服务JSR已成为Java界的一个重要标准就是这个JSR规范之一Bean Validation是一个运行时的数据验证框架的标准JSR303是专家组成员向JCP提交的第1版Bean Validation,即针对bean数据校验提出的一个规范,

从基础到源码解析的学习记录 4910
上一篇: JAVA基于CompletableFuture的流水线并行处理深度实践,满满干货
下一篇: 从单表到分表实现数据平滑迁移
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值