1. 程式人生 > 實用技巧 >關於後臺全域性異常類的捕捉返回的一些描述

關於後臺全域性異常類的捕捉返回的一些描述

package com.**.commons.config.web;

import java.util.List;

import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import com.**.commons.dto.Result;
import com.**.commons.exception.***;
import com.**.commons.exception.ErrorResultCode;
import com.**.commons.log.Marker;

import lombok.extern.slf4j.Slf4j;

/**
* ClassName: MyExceptionHandler
* Function: 全域性異常返回處理類
* date:
* @author **
* @version
* @since JDK 1.8
*/
@Slf4j
@RestControllerAdvice(basePackages = {"com.**"})
public class MyExceptionHandler
{

/**
* ***
*/
@ResponseBody
@ExceptionHandler({***.class})
@ResponseStatus(HttpStatus.OK)
public Result<Object> ***Handler(*** e) {
log.error(Marker.ERROR + e.getMessage() + ":{}", e);
return new Result<>(e.getResultCode().getErrorCode(), e.getResultCode().getError());
}

/**
* MissingServletRequestParameterException
*/
@ResponseBody
@ExceptionHandler({MissingServletRequestParameterException.class})
@ResponseStatus(HttpStatus.OK)
public Result<Object> missingServletRequestParameterExceptionHandler(MissingServletRequestParameterException e) {
log.error(Marker.ERROR + e.getMessage() + ":{}", e);
return new Result<>(ErrorResultCode.PARAM_REQUIRED.getErrorCode(), String.format(ErrorResultCode.PARAM_REQUIRED.getError(), e.getParameterName()));
}

/**
* MethodArgumentNotValidException
*/
@ResponseBody
@ExceptionHandler({MethodArgumentNotValidException.class})
@ResponseStatus(HttpStatus.OK)
public Result<Object> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
log.error(Marker.ERROR + e.getMessage() + ":{}", e);
return new Result<>(ErrorResultCode.PARAM_REQUIRED.getErrorCode(), String.format(ErrorResultCode.PARAM_REQUIRED.getError(), getBindingResultErrors(e.getBindingResult())));
}

/**
* MethodArgumentNotValidException
*/
@ResponseBody
@ExceptionHandler({HttpMediaTypeNotSupportedException.class})
@ResponseStatus(HttpStatus.OK)
public Result<Object> httpMediaTypeNotSupportedExceptionHandler(HttpMediaTypeNotSupportedException e) {
log.error(Marker.ERROR + e.getMessage() + ":{}", e);
return new Result<>(ErrorResultCode.REQUEST_TYPE_ERROR.getErrorCode(), ErrorResultCode.REQUEST_TYPE_ERROR.getError());
}

/**
* RuntimeException
*/
@ResponseBody
@ExceptionHandler({RuntimeException.class})
@ResponseStatus(HttpStatus.OK)
public Result<Object> runtimeExceptionHandler(RuntimeException e) {
log.error(Marker.ERROR + e.getMessage() + ":{}", e);
return new Result<>(ErrorResultCode.SYSTEM_ERROR.getErrorCode(), e.getClass().getName());
}

/**
* Exception
*/
@ResponseBody
@ExceptionHandler({Exception.class})
@ResponseStatus(HttpStatus.OK)
public Result<Object> exceptionHandler(Exception e) {
log.error(Marker.ERROR + e.getMessage() + ":{}", e);
return new Result<>(ErrorResultCode.SYSTEM_ERROR.getErrorCode(), e.getClass().getName());
}


/**
* 獲取valid提示
*/
private String getBindingResultErrors(BindingResult bindingResult) {
StringBuilder sb = new StringBuilder();
if (bindingResult.hasErrors()) {
List<ObjectError> list = bindingResult.getAllErrors();
for (ObjectError error : list) {
sb.append(error.getDefaultMessage() + ",");
}
}
return sb.toString();
}

}

部分欄位說明:

*** 表示自定義異常類
Result 表示自定義返回結構
ErrorResultCode 表示自定義異常返回資訊類
@ControllerAdvice/@RestControllerAdvice是controller的一個輔助類,最常用的就是作為全域性異常處理的切面類
@ControllerAdvice/@RestControllerAdvice可以指定掃描範圍,即@RestControllerAdvice(basePackages = {"com.**"})

Marker是自定義列印日誌標記,列如:
public class Marker {
public static final String ARROW = ">>>>>>";
public static final String EQUAL = "======";
public static final String QUESTION = "??????";
public static final String EXCLAMATION = "!!!!!!";
public static final String DEBUG = ">>>>>>";
public static final String INFO = "======";
public static final String WARN = "??????";
public static final String ERROR = "!!!!!!";
public static final String API_ERROR = "········";
public static final String DEFAULT = "======";

public Marker() {
}
}