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.

posted on 2020-04-23 15:10  菜霸  阅读(294)  评论(0)    收藏  举报