欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > ControllerAdvice定义统一异常处理

ControllerAdvice定义统一异常处理

2024/11/30 10:52:53 来源:https://blog.csdn.net/weixin_48247881/article/details/142449883  浏览:    关键词: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);}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com