配置异常拦截处理以及与javabean字段验证的完美结合
阅读原文时间:2023年07月09日阅读:2

Spring 3.2提供了强大的新注解   @ControllerAdvice,主要是用来Controller的一些公共的需求的低侵入性增强提供辅助,作用于@RequestMapping标注的方法上。

和此注解配合使用的其他注解有:

  1. @ExceptionHandler   自定义的错误处理器
  2. @ModelAttribute      全局的对所有的controller的Model添加属性
  3. @InitBinder  对表单数据绑定

1 .这次我们要用到他的一个特性就是 @ExceptionHandler ,可以作用于所有@RequestMapping方法上。

我们举个例子实现 用注解去验证前端传过来的javabean而不是自己去if判断,并且将验证异常返回的内容修改为我们的自己的json格式。

① 首先定义一个ControllerAdvice,必须将这个Advice会被Spring扫描到。

@ControllerAdvice
public class ValidateAdvice {

@ResponseBody  
@ExceptionHandler(value = MethodArgumentNotValidException.class)  
public Result myErrorHandler(MethodArgumentNotValidException ex) {

    return ResultUtil.error(ResultEnum.PARAM\_ERROR.getCode(),ex.getBindingResult().getFieldError().getDefaultMessage());  
}  

}

其中  MethodArgumentNotValidException 异常就是 @NotBlank 标注的字段触发后抛出的异常类型。

②其中要验证的JavaBean为

/**
* 经办人批转DTO
*/
@Data
public class TransforTaskDTO implements Serializable{
private static final long serialVersionUID = 3411962685906772077L;

// 不动产记录id  
private String id;

// 变更的经办人id  
@NotBlank(message = "用户id不能为空")  
private String userId;

}

我们验证 userId字段。

③我们的Controller为

@PostMapping("/transferTaskForRegister")  
public Result transferTask(**@Valid** @RequestBody TransforTaskDTO transforTaskDTO){

    tRegisterProcessService.transforTask(transforTaskDTO);  
    return ResultUtil.success();

}

然后最重要的是 在 验证的bean前端一定要加@Valid 才会生效。

当前端传过来参数的时候,如果userId为空,那么会抛出 MethodArgumentNotValidException,然后会在我们的ControllerAdvice中拦截这个异常,并由我们处理,将他返回指定格式的Json.