zoukankan      html  css  js  c++  java
  • SpringMvc 全局异常处理器定义,友好的返回后端错误信息

      1 package cn.com.servyou.gxdqy.exceptions;  5 import com.google.common.collect.Maps;
      6 import org.apache.log4j.Logger;
      7 import org.springframework.beans.ConversionNotSupportedException;
      8 import org.springframework.beans.TypeMismatchException;
      9 import org.springframework.http.converter.HttpMessageNotReadableException;
     10 import org.springframework.http.converter.HttpMessageNotWritableException;
     11 import org.springframework.web.HttpMediaTypeNotAcceptableException;
     12 import org.springframework.web.HttpRequestMethodNotSupportedException;
     13 import org.springframework.web.bind.MissingServletRequestParameterException;
     14 import org.springframework.web.bind.annotation.ControllerAdvice;
     15 import org.springframework.web.bind.annotation.ExceptionHandler;
     16 import org.springframework.web.bind.annotation.ResponseBody;
     17 
     18 import java.io.IOException;
     19 import java.util.Map;
     20 
     21 /**
     22  * @author : hao
     23  * @project : daieweb
     24  * @description :
     25  * @time : 2018/5/30 18:25
     26  */
     27 @ControllerAdvice
     28 public class WebExceptionHandler {
     29 
     30     private static Logger logger = Logger.getLogger(WebExceptionHandler.class);
     31 
     32 
     33     private static Map<String, String> messageMap = Maps.newHashMap();
     34 
     35     static {
     36 
     37         messageMap.put("runtimeException", "运行时异常");
     38         messageMap.put("nullPointerException", "空指针异常");
     39         messageMap.put("classCastException", "类型转换异常");
     40         messageMap.put("iOException", "IO异常");
     41         messageMap.put("noSuchMethodException", "未知方法异常");
     42         messageMap.put("indexOutOfBoundsException", "数组越界异常");
     43         messageMap.put("httpMessageNotReadableException", "参数格式错误或没有无参构造器");
     44         messageMap.put("typeMismatchException", "参数类型异常");
     45         messageMap.put("missingServletRequestParameterException", "缺少参数异常");
     46         messageMap.put("httpRequestMethodNotSupportedException", "请求类型异常");
     47         messageMap.put("httpMediaTypeNotAcceptableException", "请求后缀异常或MediaType前后不匹配");
     48         messageMap.put("conversionNotSupportedException", "类型注入可能非接口异常");
     49         messageMap.put("httpMessageNotWritableException", "结果转换异常可能存在bean属性为空");
     50     }
     51 
     52     @ExceptionHandler(RuntimeException.class)
     53     @ResponseBody
     54     public ResponseResult<Object> runtimeExceptionHandler(RuntimeException runtimeException) {
     55         logger.error(runtimeException.getMessage(), runtimeException);
     56         return RestResultGenerator.genResult(messageMap.get("runtimeException") + ":" + runtimeException.getMessage());
     57     }
     58 
     59     @ExceptionHandler(NullPointerException.class)
     60     @ResponseBody
     61     public ResponseResult<Object> nullPointerExceptionHandler(NullPointerException nullPointerException) {
     62         logger.error(nullPointerException.getMessage(), nullPointerException);
     63         return RestResultGenerator.genResult(messageMap.get("nullPointerException") + ":" + nullPointerException.getMessage());
     64     }
     65 
     66     @ExceptionHandler(ClassCastException.class)
     67     @ResponseBody
     68     public ResponseResult<Object> classCastExceptionHandler(ClassCastException classCastException) {
     69         logger.error(classCastException.getMessage(), classCastException);
     70         return RestResultGenerator.genResult(messageMap.get("classCastException") + ":" + classCastException.getMessage());
     71     }
     72 
     73     @ExceptionHandler(IOException.class)
     74     @ResponseBody
     75     public ResponseResult<Object> iOExceptionHandler(IOException iOException) {
     76         logger.error(iOException.getMessage(), iOException);
     77         return RestResultGenerator.genResult(messageMap.get("iOException") + ":" + iOException.getMessage());
     78     }
     79 
     80     @ExceptionHandler(NoSuchMethodException.class)
     81     @ResponseBody
     82     public ResponseResult<Object> noSuchMethodExceptionHandler(NoSuchMethodException noSuchMethodException) {
     83         logger.error(noSuchMethodException.getMessage(), noSuchMethodException);
     84         return RestResultGenerator.genResult(messageMap.get("noSuchMethodException") + ":" + noSuchMethodException.getMessage());
     85     }
     86 
     87     @ExceptionHandler(IndexOutOfBoundsException.class)
     88     @ResponseBody
     89     public ResponseResult<Object> indexOutOfBoundsExceptionHandler(IndexOutOfBoundsException indexOutOfBoundsException) {
     90         logger.error(indexOutOfBoundsException.getMessage(), indexOutOfBoundsException);
     91         return RestResultGenerator.genResult(messageMap.get("indexOutOfBoundsException") + ":" + indexOutOfBoundsException.getMessage());
     92     }
     93 
     94     @ExceptionHandler({HttpMessageNotReadableException.class})
     95     @ResponseBody
     96     public ResponseResult<Object> requestNotReadable(HttpMessageNotReadableException httpMessageNotReadableException) {
     97         logger.error(httpMessageNotReadableException.getMessage(), httpMessageNotReadableException);
     98         return RestResultGenerator.genResult(messageMap.get("httpMessageNotReadableException") + ":" + httpMessageNotReadableException.getMessage());
     99     }
    100 
    101     @ExceptionHandler({TypeMismatchException.class})
    102     @ResponseBody
    103     public ResponseResult<Object> requestTypeMismatch(TypeMismatchException typeMismatchException) {
    104         logger.error(typeMismatchException.getMessage(), typeMismatchException);
    105         return RestResultGenerator.genResult(messageMap.get("typeMismatchException") + ":" + typeMismatchException.getMessage());
    106     }
    107 
    108     @ExceptionHandler({MissingServletRequestParameterException.class})
    109     @ResponseBody
    110     public ResponseResult<Object> requestMissingServletRequest(MissingServletRequestParameterException missingServletRequestParameterException) {
    111         logger.error(missingServletRequestParameterException.getMessage(), missingServletRequestParameterException);
    112         return RestResultGenerator.genResult(messageMap.get("missingServletRequestParameterException") + ":" + missingServletRequestParameterException.getMessage());
    113     }
    114 
    115     @ExceptionHandler({HttpRequestMethodNotSupportedException.class})
    116     @ResponseBody
    117     public ResponseResult<Object> request405(HttpRequestMethodNotSupportedException httpRequestMethodNotSupportedException) {
    118         logger.error(httpRequestMethodNotSupportedException.getMessage(), httpRequestMethodNotSupportedException);
    119         return RestResultGenerator.genResult(messageMap.get("httpRequestMethodNotSupportedException") + ":" + httpRequestMethodNotSupportedException.getMessage());
    120     }
    121 
    122     @ExceptionHandler({HttpMediaTypeNotAcceptableException.class})
    123     @ResponseBody
    124     public ResponseResult<Object> request406(HttpMediaTypeNotAcceptableException httpMediaTypeNotAcceptableException) {
    125         logger.error(httpMediaTypeNotAcceptableException.getMessage(), httpMediaTypeNotAcceptableException);
    126         return RestResultGenerator.genResult(messageMap.get("httpMediaTypeNotAcceptableException") + ":" + httpMediaTypeNotAcceptableException.getMessage());
    127     }
    128 
    129     @ExceptionHandler({ConversionNotSupportedException.class})
    130     @ResponseBody
    131     public ResponseResult<Object> server500(ConversionNotSupportedException conversionNotSupportedException) {
    132         logger.error(conversionNotSupportedException.getMessage(), conversionNotSupportedException);
    133         return RestResultGenerator.genResult(messageMap.get("conversionNotSupportedException") + ":" + conversionNotSupportedException.getMessage());
    134     }
    135 
    136 
    137     @ExceptionHandler({HttpMessageNotWritableException.class})
    138     @ResponseBody
    139     public ResponseResult<Object> server500(HttpMessageNotWritableException httpMessageNotWritableException) {
    140         logger.error(httpMessageNotWritableException.getMessage(), httpMessageNotWritableException);
    141         return RestResultGenerator.genResult(messageMap.get("conversionNotSupportedException") + ":" + httpMessageNotWritableException.getMessage());
    142     }
    143 }

    异常结果封装:

    import java.util.List;
    import org.apache.commons.lang.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class RestResultGenerator {
        private static final Logger LOGGER = LoggerFactory.getLogger(RestResultGenerator.class);
    
        public RestResultGenerator() {
        }
    
        public static <T> ResponseResult<List<T>> genResult(PagerBean<T> data) {
            ResponseResult result = new ResponseResult();
            result.setSuccess(true);
            result.setData(data.getData());
            result.setTotal(data.getTotal());
            result.setPageIndex(data.getPageIndex());
            result.setPageSize(data.getPageSize());
            return result;
        }
    
        public static <T> ResponseResult<T> genResult(T data, String message) {
            ResponseResult result = new ResponseResult();
            result.setSuccess(true);
            result.setData(data);
            result.setMessage(message);
            return result;
        }
    
        public static <T> ResponseResult<T> genResult(String error) {
            ResponseResult result = new ResponseResult();
            if(StringUtils.isEmpty(error)) {
                result.setSuccess(true);
            } else {
                result.setSuccess(false);
            }
    
            result.setError(error);
            return result;
        }
    }
    

      

    返回结果bean:

    @JsonInclude(Include.NON_EMPTY) //为空的属性不参与序列化
    public class ResponseResult<T> {
        private boolean success = true;
        private String error;
        private T data;
        private String message;
        private long total;
        private int pageSize;
        private int pageIndex;
    
        public ResponseResult() {
        }
    
        public long getTotal() {
            return this.total;
        }
    
        public void setTotal(long total) {
            this.total = total;
        }
    
        public int getPageSize() {
            return this.pageSize;
        }
    
        public void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }
    
        public int getPageIndex() {
            return this.pageIndex;
        }
    
        public void setPageIndex(int pageIndex) {
            this.pageIndex = pageIndex;
        }
    
        public String getError() {
            return this.error;
        }
    
        public void setError(String error) {
            this.error = error;
        }
    
        public T getData() {
            return this.data;
        }
    
        public void setData(T data) {
            this.data = data;
        }
    
        public String getMessage() {
            return this.message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public boolean isSuccess() {
            return this.success;
        }
    
        public void setSuccess(boolean success) {
            this.success = success;
        }
    }
    

      

  • 相关阅读:
    django的第一次使用
    python操作文件要点
    MySQL作业笔记及总结
    ASP.NET MVC——学习WebAPI
    编写PHP框架,深入了解MVC运行流程
    MySql(分表、增量备份、还原)
    ASP.NET MVC——MVC过滤器
    ASP.NET MVC——MVC-路由
    ASP.NET MVC——MVC4优化
    JS判断指定按键(组合键)是否被按下
  • 原文地址:https://www.cnblogs.com/haoerlv/p/9810822.html
Copyright © 2011-2022 走看看