簡體   English   中英

春季啟動-使用@ControllerAdvice處理HttpClientErrorException

[英]SPRING BOOT - Handle HttpClientErrorException using @ControllerAdvice

我有一個Spring Boot Java應用程序。 由於在應用程序中使用的訪問令牌已過期,因此服務類將引發“ 401未經授權”的HttpClientErrorException。 我想全局處理該異常,為此我已使用@ControllerAdvice批注。 錯誤是:

引起原因:org.springframework.web.client.HttpClientErrorException: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應該適用於控制器,因此您應該將basePackageClasses設置為控制器軟件包而不是服務軟件包。

默認情況下, @ControllerAdvice ControllerAdvice應用於所有Controller,因此您可以刪除basePackageClasses除非您想縮小控制器的建議范圍。

我也遇到過類似的問題,

嘗試在@ControllerAdvice添加@Order(Ordered.HIGHEST_PRECEDENCE)

我們添加它以獲得優先於Spring的默認DefaultHandlerExceptionResolver 要了解更多關於我們為什么添加它的信息,請閱讀此答案 同樣也無需提供基本軟件包,默認情況下它將考慮所有軟件包。

要處理任何其他類型的異常,您可以在已經編寫的HttpClientErrorException的現有異常處理程序下面包括它,

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

希望能幫助到你 !

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM