我有一个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注释不起作用。该程序仍然抛出异常。谁能解释一下?
答案 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";
}
希望它有所帮助!