JSR303校验及统一异常处理

2024-02-04 19:28

本文主要是介绍JSR303校验及统一异常处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、JSR303校验

使用场景:需要对实体类中的字段进行校验时,可以用303校验方法。

具体步骤:
1、给实体类中的属性加注解。如@NotNull等,具体可参照javax.validation.constraints包下的注解。
2、开启验证。在需要开启验证的Controller中传入实体类参数的地方添加@Validated或者Valid注解。可参照代码:

@PostMapping("/saveBrand")public OriginResponseBody insertBrand(@Validated @RequestBody PmsBrand pmsBrand, BindingResult bindingResult)

二、自定义303校验异常返回信息

使用场景:原始303校验失败后,返回的信息可能不符合我们期望形式,在这种情况下,可自定义异常返回体。

具体步骤:
1、在上述Controller代码中的实体类参数后,添加BindingResult对象,该类中的方法可以获取303校验失败的具体信息
2、通过BindingResult对象获取想要的信息后,将其传入到自定义的返回体中,就可以按照预期返回体结构将303校验信息返回给前端了。

三、统一异常处理

使用场景:当多个Controller需要进行303校验时,可能会使用同一段代码来处理303校验失败的信息,在这种情况下,可以使用同一异常处理来集中处理303校验错误。

优点:
1、可以按照自己想要的格式返回给前端。
2、不需要每次都写同一段代码处理303校验信息,实现统一异常处理。

1、具体步骤:
只需要定义一个异常拦截器-----用于拦截Controller中捕获的异常。

@Slf4j
@RestControllerAdvice(basePackages = "com.huang.gulimall.controller")
public class ExceptionHandler {@org.springframework.web.bind.annotation.ExceptionHandler(value = MethodArgumentNotValidException.class)public OriginResponseBody exceptionHandler1(MethodArgumentNotValidException e) {log.error("异常信息:{},异常类:{}", e.getMessage(), e.getClass());BindingResult bindingResult = e.getBindingResult();List<FieldError> fieldErrors = bindingResult.getFieldErrors();Map<Object, Object> map = new HashMap<>();for (FieldError i : fieldErrors) {map.put(i.getField(), i.getDefaultMessage());}return Response.SelfResponse(400, map);}
}

说明:
1、RestControllerAdvice:表明拦截异常后,返回的是Json字符串。basePackages表示扫面这个包下的异常。
2、ExceptionHandler:拦截的异常类型。内部参数表示拦截包下哪种类型的异常。
3、方法:传入要处理的异常类,获取异常信息,并返回,返回体可以是自己定义的。

四、303分组校验

应用场景:实体类中的一个字段不同情况下有不同校验规则,就可使用分组校验。

具体步骤:
1、在某个字段中添加不同校验注解,并指定group属性。

@ApiModelProperty("品牌id")@TableId(value = "brand_id", type = IdType.AUTO)@NotBlank(message = "修改时brandId必输", groups = {UpdateBrand.class})@Null(message = "添加时brandId为空",groups = {AddBrand.class})private Long brandId;

说明:brandId字段有两个校验规则,分别为@NotBlank@Null,这两个校验规则在不同情况下使用,因此给这两个注解都指定了groups属性,用于区分不同情况下使用不同校验规则。

特别注意:由于groups属性需要的类型是Class<?>[]--接口的数组,因此首先需要创建不同的接口(如这里的UpdateBrand.class和AddBrand.class,这里必须是接口,不能是类,不然会报错),主要用来区分不同场景,接口里可以是空的。
2、Controller类中添加@Validated(value = {AddBrand.class}注解,用于指定验证某个分组的规则。

public OriginResponseBody insertBrand(@RequestBody @Validated(value = {AddBrand.class}) PmsBrand pmsBrand)

说明:只要字段校验注解的groups属性中包含@Validated里指定的名字,该校验规则就会被激活,且只会激活@Validated(value = {AddBrand.class}里指定的校验规则,其他的不会校验。

这篇关于JSR303校验及统一异常处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/678569

相关文章

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说