使用Spring Boot自带的Validator对入参dto进行校验

SpringBoot 使用 Validation 进行参数校验并统一返回校验异常 新建自定义注解java复制代码import com.jk.validator.StatusValidator;String message() default "状态传递有误";Class 阅读详情

当前端传参到controller时,后台经常要对其传来的参数进行校验,例如校验是否为空,金额的大小校验等。此时你很快就想到了用if eles如下:

public Object save(String name){

if(name==null){

throw new Exception("名称不能为空");

}

return studentService.save(name);

}

但是,如果传来的参数是这样:

public Object save(@RequestBody SaveInput input){

if(input.getName()==null){

throw new Exception("名称不能为空");

}

if(input.getAge()==null){

throw new Exception("年龄不能为空");

}

if...

return studentService.save(input);

}

额,我估计这样写在代码评审时你会被打死。下面我们来看下如何用springboot自带的validator来进行优雅的校验。

 

 

下面我们直接来撸代码:

//前端传来的dto对象

@Data

public class saveInput{

private String name;

private Integer age;

}



/**

自定义一个类实现Validator接口,重写这个接口的supports方法和validate方法

*/

@Component

public class SaveInputValidator implements Validator {



@Override

public boolean supports(Class<?> aClass) {

return SaveInput.class.isAssignableFrom(aClass);

}



/**

*这里只是举例,你可以完全按照自己的业务去做校验

**/

@Override

public void validate(Object target, Errors errors) {

ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "field.required");

SaveInput input = (SaveInput) target;

if(input.getAge<0){

errors.reject(400,"年龄不能小于0");

}

}

}





//controller

@RestController

@RequestMapping("/UserCotroller")

public class UserCotrollerextends {

@Autowired private PriceAdjustPurHeadService priceAdjustPurHeadService;

@Autowired private UserService userService;

@Autowired private SaveInputValidator saveInputValidator;



//1、对自定义的SaveInputValidator进行绑定

@InitBinder()

public void setupBinder(WebDataBinder binder) {

if (binder.getTarget() == null) {

return;

}

if (saveInputValidator.supports(binder.getTarget().getClass())) {

binder.addValidators(saveInputValidator);

}

}



//2、添加 @Validated注解

@PostMapping(value = "/save")

public Object save(@RequestBody @Validated SaveInput input){

return userService.save(name);

}

}

 

以上就是第一种情况,SaveInput里面的属性都是基本数据类型时可用,但是当SaveInput里面还有其他的自定义的dto你可能会遇到下面这种情况


 

@Data

public class saveInput{

private Head head;//单头

private List<Detatil> detailes;//明细数组

}



@Data

public class Head{

private String no;

private String ClassName;

}



@Data

public class Detail{

private String name;

private String age;

}

这种情况下,SaveInputValidator 定义改变:


@Component

public class HeadValidator implements Validator {

@Override

public boolean supports(Class<?> clazz) {

return Head.class.isAssignableFrom(clazz);

}



@Override

public void validate(Object target, Errors errors) {

Head dto = (Head ) target;

// 校验

}

}



@Component

public class DetailValidator implements Validator {



@Override

public boolean supports(Class<?> clazz) {

return PriceAdjustPurDetailInputDTO.class.isAssignableFrom(clazz);

}



@Override

public void validate(Object target, Errors errors) {

Detail dto = (Detail ) target;

// 校验

}

}



/**

* 自定义Validator

*/

@Component

public class SaveInputValidator implements Validator {

@Autowired HeadtValidator headValidator;

@Autowired DetailValidator detailValidator;



@Override

public boolean supports(Class<?> aClass) {

return SaveInput.class.isAssignableFrom(aClass);

}



@Override

public void validate(Object target, Errors errors) {

SaveInput input = (SaveInput) target;

Head head = input.getHead();

List<Detail> details = input.getDetails();

//将错误信息进行入栈操作,

errors.pushNestedPath("head");//head与saveInput中的head参数名保持一致

ValidationUtils.invokeValidator(headValidator,head,errors);

//错误信息出栈

errors.popNestedPath();



// 校验明细是否为空

int dx = 0;

for (Detail d : details) {

//错误信息入栈

errors.pushNestedPath("details[" + dx + "]");//details与saveInput中details名称保持一致

ValidationUtils.invokeValidator(detailValidator, d, errors);

//错误信息出栈

errors.popNestedPath();

dx++;

}

}

}

以上就是Validator的自定义方法,可以根据自己的实际业务场景选择不同的实现方案。

 

 

后端数据校验之Validator使用 springboot项目对前端传入参数进行校验,减少业务代码冗余 阅读详情

相关推荐

Spring Boot 实现各种参数校验,写得太好了,建议收藏!

本次打算彻底搞懂Spring Validation。本文会详细介绍Spring Validation各种场景下的最佳实践及其实现原理,死磕到底!Java API规范(JSR303)定义了Bean校验的标准validation-api,但没有提供实现。hibernate validation是对这个规范的实现,并增加了校验注解如@Email、@Length等。Spring Validation是对hibernate validation的二次封装,用于支持spring mvc参数自动校验。接下来,我们以spr

m0_71777195的博客 572

spring之Validator

初步认识 spring数据验证核心类:①:Validator ②:Errors,两者之间的纽带是Validator中定义的validate方法。 public interface Validator { // 限定Validator的职责,不可能所有的校验全部交给一个Validator来做 boolean supports(Class<?> clazz); // 将target校验错误信息放入Errors中 void validate(Object target, Errors er

原之殇 4468

Spring数据校验:深入理解Validator接口与实践

Validator接口位于supports和validate。supports方法用于判断校验器是否支持给定的类,而validate方法则负责对目标对象执行校验操作。通过本文的探讨,我们了解到Spring框架中Validator接口的使用方法和最佳实践。数据校验不仅保障了应用程序的数据一致性和安全性,而且通过国际化消息支持,提高了用户体验。希望本文能够帮助开发者在Spring应用程序中更有效地实现数据校验。

m0_62153576的博客 767

使用Spring的Validator接口进行校验

你可以使用Spring提供的validator接口进行对象的校验。Validator接口与Errors协同工作,在Spring做校验的时候,它会将所有的校验错误汇总到Errors对象中去。 <br />来看这个简单的数据对象:public class Person { private String name; private int age; // the usual getters and setters... }<br />实现org.springframework.val

wcp88888888的专栏 8422

Spring Boot接口入参校验终极指南:从注解到手动校验的深度解析

API参数校验最佳实践:构建健壮的微服务接口 参数校验是API设计的核心环节,直接影响系统安全性和稳定性。本文系统介绍了两种主流校验方式: 基于注解的Bean Validation 通过@NotNull、@Size等标准注解实现声明式校验 支持嵌套校验(@Valid)和分组校验(@Validated) 自动生成清晰错误提示(如"邮箱格式不正确") 手动Validator接口 适合复杂业务规则(如跨字段校验、金额计算) 可自定义验证逻辑(如结束时间必须晚于开始时间) 两种方式配合全局异常处

墨夶的博客 736

Demo——使用Spring的Validator接口进行数据验证

这个Demo示范了怎么通过Spring的Validator接口来进行数据验证,包括Validator的复用、jsp错误信息的展示等。可参考本人博客: http://blog.youkuaiyun.com/oLanMoMo/article/details/50530352

spring-boot-starter-validation进行参数校验

引入依赖pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 常用注解 注意不用错了类型! 注解 限制 @Null 限制只能为

吹灭读书灯 一身都是月的博客 8369

FPGA控制DDR读写(AXI4总线接口)

FPGA控制DDR读写

qq_42712308的博客 1万+

Spring Boot DTO 验证示例

我们不会将 Java Bean 验证注释添加到 JPA 实体,而是将 Java Bean 验证注释添加到 DTO,因为我们将在 REST API 的请求和响应中使用 DTO。JSR 380 是用于 Bean 验证的 Java API 规范,它使用 @NotNull、@Min 和 @Max 等注释确保 Bean 的属性满足特定条件。在本教程中,我们学习了如何使用Hibernate验证器在Spring boot REST API中验证DTO对象。只能应用于文本值,并验证属性是否为 null 或空格。

allway2的博客 1853

使用基于python的neurora进行表征相似性分析(RSA)

发现了一款用于表征分析的Python API,还是挺方便的,这里简单介绍一下进行表征相似性分析的使用方法。

zjh12312311的博客 2766

抖音用户评论和ID的采集方法

随着5G时代的普及,各大运营商的套餐纷纷推出,使得流量成本进一步降低。同时5G线路高宽带、低延迟的技术特性和手机普及,让视频用户访问量快速增加。 由于大量的视频工具和拍摄APP的提供,让短视频的拍摄、制作包括发行都变得更加简单便捷,越来越多的普通人可以投入视频创作,创造了更丰富的互联网内容,视频作者从视频推广中能获取粉丝和推广收益。 目前抖音就是目前最重要的短视频平台之一,要及时获取上面的用户评论和ID,需要结合爬虫代理实现采集方案,下面的代码就能快速采集相关信息: package htmlunit; i

ssbt_2020的博客 6787

Spring Boot 实现各种参数校验,非常实用

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

Trouvailless的博客 1934

宝塔面板+pbootCMS建站全流程:从服务器选购到上线优化(附常见问题排查)

本文提供了一份详尽的宝塔面板与pbootCMS建站实战指南。内容涵盖从云服务器选购、宝塔面板部署与安全加固,到pbootCMS安装、权限配置、数据库连接等核心步骤。同时深入讲解了PHP环境优化、Nginx伪静态设置、缓存开启等性能与SEO优化技巧,并附有常见问题排查与后期维护建议,帮助用户高效、稳健地完成专业网站构建。

e4f5g6h的博客 661

Spring Boot 实现各种参数校验(附项目源码)

本文会详细介绍Spring Validation各种场景下的最佳实践及其实现原理,死磕到底!

后端元宇宙 1206

clock min pulse width检查

高电平脉宽 = clock fall edge到达FF/CK的时间 - clock rise edge到达FF/CK的时间;低电平脉宽 = 下一T clock rise edge到达FF/CK的时间 - clock fall edge到达FF/CK的时间。而required pulse width是根据FF/CK处的transition,根据查找表计算得到的。为什么clock transition越大,会导致required pulse width越大呢?5、 降低clock上的串扰。

芯冰乐 577

JAVA:Spring Boot 集成 LibreOffice 实现文档在线转换服务

本文介绍了在企业级应用开发中使用LibreOffice实现文档格式转换的技术方案。通过对比分析商业库、纯Java方案和云服务API的优缺点,重点阐述了LibreOffice在格式兼容性、转换质量和零成本方面的优势。文章详细说明了环境准备步骤,包括Windows/Linux系统安装LibreOffice、解决中文乱码问题以及Docker部署方案。最后提供了Spring Boot项目的基本配置,包括Maven依赖和application.yml配置文件,为构建稳定高效的文档转换服务奠定基础。

木头 520

Spring Boot 实现各种参数校验

目录 1、简单使用 1、引入依赖 2、requestBody参数校验 3、requestParam/PathVariable参数校验 4、统一异常处理 2、进阶使用 1、分组校验 2、嵌套校验 3、集合校验 4、自定义校验 5、编程式校验 6、快速失败 (Fail Fast) 7、@Valid和@Validated区别 3、实现原理 1、requestBody参数校验实现原理 2、方法级别的参数校验实现原理 1、简单使用 Java API规范 (JSR303) 定义了

mengo的博客 642

addBumpConnectTargetConstraint 命令详解

本文介绍了Cadence Innovus中用于倒装芯片设计的addBumpConnectTargetConstraint命令的核心功能和使用方法。该命令主要用于为凸点(Bump)添加连接目标约束,通过绑定实例、引脚/网络和端口号等属性,实现凸点与电源/信号网络的精准映射。文章详细解析了命令语法结构、参数说明及使用场景,包括必选参数(指定凸点方式)、分支选择(实例连接或电源连接类型)以及互斥参数(引脚名与网络名)等重要注意事项,并提供了典型应用示例。该命令特别适用于倒装芯片设计中凸点与PG网络、IO实例的连接

u013620135的博客 394

Spring Boot 参数校验

如果后端未做参数校验的话,会使未经校验的参数经过service层来到dao层直至数据库,造成十分严重的后果。

码刀攻城 1907

RK3576 调试ov2735 mipi-csi摄像头

摘要:本文记录了基于RK3576平台调试OV2735 MIPI摄像头的全过程。开发环境采用Linux 6.1内核和Buildroot文件系统。调试步骤包括:1)硬件检查(电源、晶振和引脚连接);2)驱动配置(设备树节点、ISP通道设置);3)驱动验证(通过ID检测和I2C工具测试);4)推流测试(使用v4l2和gstreamer工具)。重点解决了复位引脚配置、时钟命名匹配等关键问题,并通过寄存器检查确保初始化正常。最终实现了摄像头数据流的成功输出,为嵌入式视觉应用开发提供了完整参考方案。

qq_45147279的博客 1062

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

拒绝 DTO 爆炸:详解 Spring Boot 参数校验中的“分组校验” (Validation Groups) 技巧

定义分组 -> 标记规则 -> 触发校验。这只是一个普通的 Java 接口,不需要任何方法,它的唯一作用就是做一个“标签”。// 定义两个分组接口Validation Groups (分组校验)是 Spring Boot 开发中精简代码的神器。本质:给校验注解加上“条件判断”。核心:通过空接口定义分组 (使用:在注解中指定。触发自动:Controller 层使用。手动:Service 层使用。最佳实践:让自定义分组继承Default接口,避免漏掉通用校验规则。

czlczl20020925的博客 487

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Spring Validation 参数校验框架

业务需求总是比框架提供的这些简单校验要复杂的多,已有的注解不能满足所有的校验要求,特殊的情况需要自定义校验(自定义校验注解)自定义约束注解@Documented//元注解/***元注解 标明注解可以用在哪里,属性,方法,类....我们这里用到属性上,只需有field即可*///标明我们的注解会在哪个阶段保留,源码,编译,运行,//用来指定谁给注解提供校验规则validatedBy = {StateValidation.class}//指定提供校验规则的类。

m0_74808313的博客 2180

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring Boot + hibernate validation 实现各种 web 参数校验一

目录 Spring Validation 校验概述 RequestBody 参数校验 RequestParam/PathVariable 参数校验 全局统一异常处理 Spring Validation 校验概述 1、Java API 规范(JSR303) 定义了 Bean 校验的标准 validation-api,但却没有提供实现。hibernate validation 是对这个规范的实现,并增加了校验注解如 @Email、@Length等。 2、Spring Validation 是对 h

蚩尤后裔-汪茂雄 2694

Spring Boot认证请求模型设计:从字段校验到安全序列化的实战指南

在Java Web开发中,数据校验与序列化是构建健壮应用的基础。通过JSR-380规范,开发者可以在DTO层实现声明式校验,有效拦截非法数据。这种分层校验策略不仅提升了代码可维护性,还能在业务逻辑执行前快速失败,降低系统负载。结合Spring Boot的自动配置,校验注解如@NotBlank、@Pattern能无缝集成到Controller层。在工程实践中,认证请求模型的设计尤为关键,它需要兼顾多种登录场景的扩展性,同时确保敏感信息如密码在日志和序列化过程中的安全。本文以AuthRequest类为例,深入探

weixin_33924220的博客 536

手把手教你利用Spring Boot实现各种参数校验

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

CXY_QIQI的博客 1178

Spring Boot 参数校验 Validation 终极指南

注解使用场景抛出异常@Valid校验对象参数(如 @RequestBody)@Validated校验简单类型参数(如 @RequestParam)@Validated校验对象参数(需配合 @Valid 使用)在大多数项目中,无论是 Bean Validation 定义的约束,还是 Hibernate Validator 附加的约束,都是无法满足我们复杂的业务场景。所以,我们需要自定义约束。1)编写自定义约束的注解;2)编写自定义的校验器 ConstraintValidator。

〆、挽风的博客 2183
上一篇: 超级详细的redis命令大全
下一篇: 记录一次java面试题
codelady
博客等级 码龄11年 26粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值