在分布式系统中,定义一个全局异常处理器stater,其它微服务只需要引入依赖即可。
为了方便维护错误信息,因此将错误信息封装到一个枚举中。
为了封装异常处理代码,因此将所有接口的异常处理封装到了springmvc的 ControllerAdvice 中。
二、代码实现:1、引入依赖:
org.springframework.boot spring-boot-starter-weborg.projectlombok lombok
2、新建一个接口:
public interface IException { public int getCode(); public String getMessage(); }
3、新建一个枚举类:
@NoArgsConstructor @AllArgsConstructor public enum ExceptionEnum implements IException { NOT_FIND(404, "查询失败"), ; int code; String message; @Override public int getCode() { return code; } @Override public String getMessage() { return message; } }
4、新建一个自定义异常类:
error方法可同时记录日志和向上抛异常
@Data public class MyException extends RuntimeException { private Integer errorCode; private String errorMessage; public MyException (IException iException) { this.errorCode = iException.getCode(); this.errorMessage = iException.getMessage(); } public static void error(Logger logger, IException e,Exception source) { logger.error("异常码[{}],异常提示[{}],异常详情:", e.getCode(), e.getMessage(),source); throw new MyException (e); } public static void error(Logger logger, IException e) { logger.error("异常码[{}],异常提示[{}]", e.getCode(), e.getMessage()); throw new MyException (e); } }
5、全局异常处理器(处理逻辑较为简单,仅供参考):
@ControllerAdvice @ResponseBody public class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class) public ResponseEntity
6、新增自动配置文件GlobalExceptionHandlerAutoConfiguration
@Configuration public class GlobalExceptionHandlerAutoConfiguration { @Bean public GlobalExceptionHandler globalExceptionHandler() { return new GlobalExceptionHandler(); } }
7、新增resouces/meta-INF/spring.factories,内容如下:
#值为自定义的自动配置文件路径 org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.test.exception.GlobalExceptionHandlerAutoConfiguration
8、记录日志:
引入依赖:
org.springframework.boot spring-boot-starter-logging
新建文件logback-spring.xml:
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n INFO ACCEPT DENY %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n d:/logs/info/info.%d.log WARN ACCEPT DENY %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n d:/logs/warn/warn.%d.log ERROR %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n d:/logs/error/error.%d.log
9、使用时,在其它模块中引入此模块依赖,业务代码如下:
try{ ... } catch (Exception e) { MyException.error(log,ExceptionEnum.BRAND_NOT_FOUND,e); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)