Feign 是一個聲明式的 Web 服務客戶端,它使得編寫 Web 服務客戶端變得更加簡單。在使用 Feign 時,我們通常會處理兩種類型的錯誤:Feign 異常(FeignException)和遠程服務錯誤(如 HTTP 狀態碼表示的錯誤)。
FeignException 是一個通用的異常,它包含了 Feign 調用的詳細信息,如錯誤代碼、錯誤消息等。要處理 FeignException,你可以在你的接口方法中使用 @ExceptionHandler
注解來捕獲并處理這個異常。例如:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(FeignException.class)
public ResponseEntity<String> handleFeignException(FeignException e) {
// 處理 FeignException,例如返回自定義的錯誤響應
return ResponseEntity.status(e.status()).body("Feign Exception: " + e.getMessage());
}
}
當遠程服務返回非 200 的 HTTP 狀態碼時,Feign 會拋出一個 FeignException.Error
異常。要處理這種錯誤,你可以在你的接口方法中使用 @ExceptionHandler
注解來捕獲并處理這個異常。例如:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(FeignException.Error.class)
public ResponseEntity<String> handleFeignError(FeignException.Error e) {
// 處理 FeignError,例如返回自定義的錯誤響應
return ResponseEntity.status(e.status()).body("Remote Service Error: " + e.getMessage());
}
}
此外,你還可以使用 ErrorDecoder
接口來自定義錯誤處理邏輯。要創建一個自定義的 ErrorDecoder
,你需要實現這個接口并實現 decode
方法。例如:
public class CustomErrorDecoder implements ErrorDecoder {
@Override
public Exception decode(Response response) {
// 根據響應狀態碼和響應體創建自定義異常
if (response.status() == HttpStatus.NOT_FOUND) {
return new ResourceNotFoundException("Resource not found");
} else if (response.status() == HttpStatus.INTERNAL_SERVER_ERROR) {
return new ServerErrorException("Internal server error");
} else {
return new FeignException.Error(response.status(), response.body().string());
}
}
}
然后,你需要在你的 Feign 客戶端配置中注冊這個自定義的 ErrorDecoder
。例如:
@Configuration
public class FeignClientConfig {
@Bean
public ErrorDecoder errorDecoder() {
return new CustomErrorDecoder();
}
@Bean
public Feign.Builder feignBuilder(ErrorDecoder errorDecoder) {
return Feign.builder()
.client(new Retryer.Default(100, 1000, 3))
.decoder(errorDecoder);
}
}
這樣,當遠程服務返回錯誤狀態碼時,Feign 會使用你提供的自定義 ErrorDecoder
來處理錯誤。