SPRING BOOT - 使用@ControllerAdvice处理HttpClientErrorException

时间:2018-05-14 11:23:19

标签: java spring-boot

我有一个Spring Boot Java应用程序。有一个服务类会抛出一个未经授权的" 401 Unauthorized" HttpClientErrorException,因为应用程序中使用的访问令牌已过期。我想全局处理这个异常,我使用了@ControllerAdvice注释。 错误是:

引起:org.springframework.web.client.HttpClientErrorException:401 Unauthorized

课程是:

@Slf4j
@EnableWebMvc
@ControllerAdvice(basePackages = Service.class)
public class HttpClientErrorHandler{
    @ExceptionHandler(HttpClientErrorException.class)
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    public String errorHandle(HttpClientErrorException e) {
        log.error("log HttpClientErrorException: ", e);
    return "HttpClientErrorException_message";
   }
}

由于异常是在服务类中引起的,因此我在basePackages中特别提到了它。程序的整个配置在application.yml文件中指定。我没有使用xml配置。我不明白为什么@ControllerAdvice注释不起作用。该程序仍然抛出异常。谁能解释一下?

2 个答案:

答案 0 :(得分:0)

@ControllerAdvice(basePackages = Service.class)

该异常冒泡到@Controller类,@ControllerAdvice应该适用于控制器,因此您应该将basePackageClasses设置为您的控制器包而不是您的服务包。

默认情况下,@ControllerAdvice适用于所有控制器,因此您可以移除basePackageClasses,除非您想缩小控制器建议范围

答案 1 :(得分:0)

我也遇到过类似的问题,

尝试在@Order(Ordered.HIGHEST_PRECEDENCE)下面添加@ControllerAdvice

我们添加它以优先于Spring的默认DefaultHandlerExceptionResolver。要详细了解我们添加它的原因,请阅读this answer。 也不需要提供基础包,它默认会考虑所有包。

要处理任何其他类型的异常,您可以在已编写的HttpClientErrorException的现有异常处理程序下面包含

@ExceptionHandler(Exception.class)
public Strring handleAnyExceptions(Exception ex) {
    return "your message";
} 

希望它有所帮助!