zoukankan      html  css  js  c++  java
  • Spring Boot @ControllerAdvice+@ExceptionHandler处理controller异常

    需求:

      1.spring boot 项目restful 风格统一放回json

      2.不在controller写try catch代码块简洁controller层

      3.对异常做统一处理,同时处理@Validated 校验器注解的异常

    方法:

      @ControllerAdvice 注解定义全局异常处理类

      

    @ControllerAdvice
    public class ControllerExceptionHandler {

    }

      @ExceptionHandler 注解声明异常处理方法

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public ResponseResult handlerException(Exception e){
    logger.error(e.getMessage(),e);
    ResponseResult responseResult = new ResponseResult(ResponseCode.ERROR,e.getMessage());
    return responseResult;
    }

      处理@Validated 校验器注解的异常

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public ResponseResult handlerMethodArgumentException(MethodArgumentNotValidException e){
    logger.error(e.getMessage(),e);

    BindingResult bindingResult = e.getBindingResult();
    String message = ValidMethodUtils.validMethod(bindingResult);
    ResponseResult responseResult = new ResponseResult(ResponseCode.ERROR,message);
    return responseResult;
    }

    完整代码如下:

    package com.travelsky.travelcloud.exception;

    import com.travelsky.travelcloud.utils.ResponseCode;
    import com.travelsky.travelcloud.utils.ResponseResult;
    import com.travelsky.travelcloud.utils.bizutils.ValidMethodUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.http.HttpStatus;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.bind.MethodArgumentNotValidException;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.ResponseStatus;

    /**异常统一处理的类
    * Created by Liyan on 2018/3/22.
    */
    @ControllerAdvice
    public class ControllerExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(ControllerExceptionHandler.class);

    /*create by LiYan on 2018.3.25.
    * 处理不可预知的异常
    * */
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public ResponseResult handlerException(Exception e){
    logger.error(e.getMessage(),e);
    ResponseResult responseResult = new ResponseResult(ResponseCode.ERROR,e.getMessage());
    return responseResult;
    }

    /*create by LiYan on 2018.3.30.
    * 处理接口数据校验的异常
    * */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public ResponseResult handlerMethodArgumentException(MethodArgumentNotValidException e){
    logger.error(e.getMessage(),e);

    BindingResult bindingResult = e.getBindingResult();
    String message = ValidMethodUtils.validMethod(bindingResult);
    ResponseResult responseResult = new ResponseResult(ResponseCode.ERROR,message);
    return responseResult;
    }

    }

    如处理自定义异常可修改如下注解

    @ExceptionHandler(自定义异常.class)

  • 相关阅读:
    SQL2005四个排名函数(row_number、rank、dense_rank和ntile)的比较
    浅谈数据库索引
    移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
    http协议学习系列
    隐藏帧技术
    第2章:标准输入与输出
    第1章:认识Shell脚本
    Cisco配置单臂路由及静态路由
    Cisco交换机端口聚合(EtherChannel)
    Cisco配置VLAN+DHCP中继代理+NAT转发上网
  • 原文地址:https://www.cnblogs.com/HanShisi/p/8717065.html
Copyright © 2011-2022 走看看