springboot全局异常处理器stater

springboot全局异常处理器stater,第1张

springboot全局异常处理器stater 一、目的:

在分布式系统中,定义一个全局异常处理器stater,其它微服务只需要引入依赖即可。

为了方便维护错误信息,因此将错误信息封装到一个枚举中。

为了封装异常处理代码,因此将所有接口的异常处理封装到了springmvc的 ControllerAdvice 中。

二、代码实现:

1、引入依赖

        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.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> exceptionHandler(Exception e, HttpServletRequest request){
        log.error("Global Exception Occured => url : {}", request.getRequestURL());
        //打印完成错误信息,方便调试
        e.printStackTrace();
        //检测是否是自定义异常,如果是响应详细信息
        if(e instanceof EgoException){
            EgoException exception=(EgoException) e;
            //利用Map实现VO(也可以自定义VO)
            Map resultVO = new HashMap<>(2);
            resultVO.put("errorCode", exception.getErrorCode());
            resultVO.put("errorMessage", exception.getErrorMessage());
            //将具体错误信息响应给客户端
            return ResponseEntity.status(exception.getErrorCode()).body(resultVO);
        }

        // 如果不是,直接返回500
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }

}

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);
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5684367.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存