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

ControllerAdvice定义统一异常处理

springboot版本:2.6.13<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>

在实体上添加校验注解,例如:

	@NotBlank@NotEmpty@NotNullprivate String name;

设置自定义校验注解

package com.xdtmall.common.valid;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;@Documented
//使用什么校验器
@Constraint(validatedBy = { ListValueConstraintValidator.class })
//标注注解能用在什么位置;方法;属性;
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
//校验注解的时机   运行时获取
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {String message() default "{javax.validation.constraints.NotBlank.message}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};int[] vals() default {};
}
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {private Set<Integer> set =new HashSet<>();//初始化方法@Overridepublic void initialize(ListValue constraintAnnotation) {int[] vals = constraintAnnotation.vals();System.out.println(vals);for (int val : vals) {set.add(val);}}//判断是否校验成功/**** @param integer 需要校验的值* @param constraintValidatorContext* @return*/@Overridepublic boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {return set.contains(integer);//判断是否包含}
}

分组校验:
1、新建组的接口
2、绑定到相应的组

	@NotNull(message = "修改必须指定id",groups = {UpdateGroup.class})@Null(message = "新增不能指定id",groups = {AddGroup.class})@TableIdprivate Long brandId;@NotBlank(message = "品牌名不能为空",groups = {AddGroup.class,UpdateGroup.class})private String name;@NotNull(groups = {AddGroup.class})@URL(message = "logo必须是一个合法的url地址",groups = {AddGroup.class,UpdateGroup.class})private String logo;private String descript;@NotNull(groups = {AddGroup.class,UpdateStatusGroup.class})/*使用自定义校验注解*/@ListValue(vals={0,1},groups = {AddGroup.class, UpdateStatusGroup.class})private Integer showStatus;@NotNull(groups = {AddGroup.class})@Pattern(regexp = "^[a-zA-Z]$",message = "检索首字母必须是一个字母",groups = {AddGroup.class, UpdateGroup.class})private String firstLetter;@NotNull(groups = {AddGroup.class})@Min(value = 0,message = "排序必须大于等于0",groups = {AddGroup.class,UpdateGroup.class})private Integer sort;

controller修改成@Validated(绑定的组)

  @RequestMapping("/update")//@RequiresPermissions("product:brand:update")public R update(@Validated(UpdateGroup.class) @RequestBody BrandEntity brand){brandService.updateById(brand);return R.ok();}
@RequestMapping("/update")//@RequiresPermissions("product:brand:update")public R update(@Valid @RequestBody Entity erand, BindingResult bindingResult){if (bindingResult.hasErrors()) {//如果有校验错误,返回第一个校验信息List<ObjectError> allErrors = bindingResult.getAllErrors();System.out.println(allErrors);//将错误信息返回或者抛异常全局处理。}entityService.updateById(brand);return R.ok();}

在controller添加,例如:

@RequestMapping("/update")//@RequiresPermissions("product:brand:update")public R update(@Valid @RequestBody Entity erand, BindingResult bindingResult){if (bindingResult.hasErrors()) {//如果有校验错误,返回第一个校验信息List<ObjectError> allErrors = bindingResult.getAllErrors();System.out.println(allErrors);//将错误信息返回或者抛异常全局处理。}entityService.updateById(brand);return R.ok();}

使用@RestControllerAdvice统一处理异常信息

@RestControllerAdvice
@Slf4j
public class productExceptionControllerAdvice {@ExceptionHandler(Exception.class)public R handleValidException(MethodArgumentNotValidException e) {log.error("数据效验出现问题{},异常类型{}",e.getMessage(),e.getClass());BindingResult bindingResult = e.getBindingResult();Map<String,String> errMap = new HashMap<>();bindingResult.getFieldErrors().forEach((fieldError) -> {errMap.put(fieldError.getField(),fieldError.getDefaultMessage());});return R.error("校验异常").put("data",errMap);}
}
http://www.lryc.cn/news/447406.html

相关文章:

  • Leetcode 162.寻找峰值
  • c语言:知识补充
  • Dapper介绍及特性
  • LeetCode 149. 直线上最多的点数
  • 案例研究丨国控星鲨利用DataEase释放数据潜能,重塑业务视野
  • 网络基础概念和 socket 编程
  • TypeScript 中的接口、泛型与自定义类型
  • 常州威雅学校:跟随这场音乐盛宴,溯回她的音乐之路
  • 【YashanDB知识库】由于hist_head$中analyze time小于tab$中analyze time导致的sql语句执行慢
  • 【有啥问啥】深度理解主动学习:机器学习的高效策略
  • 智能守护者X100 - 自动化生产线智能机器人安全监控管理系统
  • harmonyos面试题
  • 神经网络介绍及其在Python中的应用(一)
  • 数据流处理技术与Flink框架
  • qt中QTatlewidget类常用操作表格的函数有哪些?
  • Linux上的C/C++编程
  • 注意 秋季饮酒的正确打开方式
  • Python如何配置环境变量详解
  • Linux驱动开发(速记版)--并发与竞争
  • AI赋能,数字技术服务平台促进产业协同发展
  • RabbitMQ下载安装运行环境搭建
  • Redis过期时间删除策略详解
  • mysql数据库的基本管理
  • 根据现有html里的元素上面动态创建el-tooltip组件并显示的几种方式
  • 【C++篇】迈入新世界的大门——初识C++(上篇)
  • 啥?Bing搜索古早BUG至今未改?
  • ValueError: Out of range float values are not JSON compliant
  • 【架构】NewSQL
  • 禁止吸烟监测系统 基于图像处理的吸烟检测系统 YOLOv7
  • 《中国工程科学》