package com.jsh.erp.exception; import com.alibaba.fastjson.JSONObject; import com.jsh.erp.constants.ExceptionConstants; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; import java.util.List; import java.util.stream.Collectors; @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class) @ResponseBody public Object handleException(Exception e, HttpServletRequest request) { JSONObject status = new JSONObject(); // 针对业务参数异常的处理 if (e instanceof BusinessParamCheckingException) { status.put(ExceptionConstants.GLOBAL_RETURNS_CODE, ((BusinessParamCheckingException) e).getCode()); status.put(ExceptionConstants.GLOBAL_RETURNS_DATA, ((BusinessParamCheckingException) e).getData()); return status; } //针对业务运行时异常的处理 if (e instanceof BusinessRunTimeException) { status.put(ExceptionConstants.GLOBAL_RETURNS_CODE, ((BusinessRunTimeException) e).getCode()); status.put(ExceptionConstants.GLOBAL_RETURNS_DATA, ((BusinessRunTimeException) e).getData()); return status; } // 这里针对校验org.springframework.web.bind.MethodArgumentNotValidException 异常的处置 if (e instanceof MethodArgumentNotValidException) { status.put(ExceptionConstants.GLOBAL_RETURNS_CODE, 400); List errorMessages = ((MethodArgumentNotValidException) e).getBindingResult().getFieldErrors() .stream() .map(fieldError -> fieldError.getField() + ": " + fieldError.getDefaultMessage()) .collect(Collectors.toList()); // 以 JSON 数组形式返回 status.put(ExceptionConstants.GLOBAL_RETURNS_MESSAGE, errorMessages); return status; } status.put(ExceptionConstants.GLOBAL_RETURNS_CODE, ExceptionConstants.SERVICE_SYSTEM_ERROR_CODE); status.put(ExceptionConstants.GLOBAL_RETURNS_DATA, ExceptionConstants.SERVICE_SYSTEM_ERROR_MSG); log.error("Global Exception Occured => url : {}, msg : {}", request.getRequestURL(), e.getMessage()); /** * 这里输出完整的堆栈信息,否则有些异常完全不知道哪里出错了。 */ log.error("Global Exception Occured => url : {}", request.getRequestURL(), e); return status; } }