package org.jeecg.modules.dnc.exception; import com.google.common.collect.ImmutableMap; import org.jeecg.modules.dnc.response.AuthCode; import org.jeecg.modules.dnc.response.CommonCode; import org.jeecg.modules.dnc.response.ResponseResult; import org.jeecg.modules.dnc.response.ResultCode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.converter.HttpMessageNotReadableException; 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.client.HttpClientErrorException; import java.nio.file.AccessDeniedException; /** * 统一异常捕获类 * @author Administrator * @version 1.0 * @create 2018-09-14 17:32 **/ @ControllerAdvice//控制器增强 public class ExceptionCatch { private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class); //定义map,配置异常类型所对应的错误代码 private static ImmutableMap,ResultCode> EXCEPTIONS; //定义map的builder对象,去构建ImmutableMap protected static ImmutableMap.Builder,ResultCode> builder = ImmutableMap.builder(); //捕获CustomException此类异常 @ExceptionHandler(CustomException.class) @ResponseBody public ResponseResult customException(CustomException customException){ //记录日志 LOGGER.error("catch exception:{}",customException.getMessage()); ResultCode resultCode = customException.getResultCode(); return new ResponseResult(resultCode); } //捕获Exception此类异常 @ExceptionHandler(Exception.class) @ResponseBody public ResponseResult exception(Exception exception){ //记录日志 LOGGER.error("catch exception:{}",exception.getMessage()); //exception.printStackTrace(); if(EXCEPTIONS == null){ EXCEPTIONS = builder.build();//EXCEPTIONS构建成功 } //从EXCEPTIONS中找异常类型所对应的错误代码,如果找到了将错误代码响应给用户,如果找不到给用户响应99999异常 ResultCode resultCode = EXCEPTIONS.get(exception.getClass()); if(resultCode !=null){ return new ResponseResult(resultCode); }else{ if(exception.getMessage().startsWith("401")) { return new ResponseResult(AuthCode.AUTH_CREDENTIAL_ERROR); }else if(exception.getMessage().startsWith("400")) { return new ResponseResult(AuthCode.AUTH_CREDENTIAL_ERROR); } //返回99999异常 return new ResponseResult(CommonCode.SERVER_ERROR); } } static { //定义异常类型所对应的错误代码 builder.put(HttpMessageNotReadableException.class,CommonCode.INVALID_PARAM); builder.put(AccessDeniedException.class, CommonCode.UNAUTHORISE); builder.put(HttpClientErrorException.BadRequest.class, AuthCode.AUTH_CREDENTIAL_ERROR); } }