Java SPRING启动-使用@ControllerAdvice处理HttpClientErrorException

Java SPRING启动-使用@ControllerAdvice处理HttpClientErrorException,java,spring-boot,Java,Spring Boot,我有一个SpringBootJava应用程序。有一个服务类抛出“401 Unauthorized”HttpClientErrorException,因为应用程序中使用的访问令牌已过期。我希望全局处理我已使用@ControllerAdvice注释的此异常。 错误是: 原因:org.springframework.web.client.httpclienterror异常:401未经授权 课程为: @Slf4j @EnableWebMvc @ControllerAdvice(basePackages

我有一个SpringBootJava应用程序。有一个服务类抛出“401 Unauthorized”HttpClientErrorException,因为应用程序中使用的访问令牌已过期。我希望全局处理我已使用@ControllerAdvice注释的此异常。 错误是:

原因:org.springframework.web.client.httpclienterror异常:401未经授权

课程为:

@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注释不起作用。程序仍然抛出异常。有人能解释一下吗

@ControllerAdvice(basePackages=Service.class)

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


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

尝试在
@ControllerAdvice
下面添加
@Order(有序。最高优先级)

我们添加它是为了获得比Spring默认的
DefaultHandlerExceptionResolver
更高的优先级。要了解更多关于我们为什么添加它的信息,请阅读。 也不需要提供基本包,它将默认地考虑所有包。

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

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

希望有帮助

我尝试了您的解决方案,但它仍然无法处理异常。好的,为什么在
HttpClientErrorHandler
中需要@Slf4j@EnableWebMvc?发生异常时,请尝试删除这些设置并尝试将调试断点放置在
HttpClientErrorHandler
中。尝试并检查它是否有帮助。是的,我理解你想说的话,并按照你的建议进行了必要的更改,但它仍然没有处理异常:(