#24 [SpringBoot/KotlinでBFF]ConnectTimeout/ReadTimeoutのエラーハンドリング

RestTemplateで呼び出した外部APIでConnectTimeout/ReadTimeoutが発生した場合のハンドリングを追加する。ConnectTimeout/ReadTimeout共にResourceAccessExceptionクラスとしてハンドリングできる。

@RestControllerAdvice
class GlobalExceptionHandler {

    @ExceptionHandler(ResourceAccessException::class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    fun handleHttpServerErrorException(e: ResourceAccessException): String {
        return "Internal Server Error"
    }
}

確認

意図的にReadTimeout/意図的にConnectTimeoutを発生させて、POSTMANでリクエストを実行。
HttpStatusが500(Internal Server Error)、レスポンスボディが指定した”Internal Server Error”になっている事を確認。

SpringBootが出力するWARNログを確認

ReadTimeout
2021-01-03 17:07:26.675  WARN 10701 --- [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:50000/tasks/12345": Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out]
ConnectTimeout
2021-01-03 17:12:12.866  WARN 10738 --- [nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://127.0.0.2/tasks/12345": Connect to 127.0.0.2:80 [/127.0.0.2] failed: Connect timed out; nested exception is org.apache.http.conn.ConnectTimeoutException: Connect to 127.0.0.2:80 [/127.0.0.2] failed: Connect timed out]

コード

https://github.com/little-engineer/bff-sample/pull/31/files

参考

Spring公式

コメントを残す

メールアドレスが公開されることはありません。

ABOUT US
little
15年以上プログラマーをしているエンジニアです。Kotlin, Java, Python, C++を使用したServerSideの開発に携わってきました。とりあえずやってみるスタイルで記事を更新していきます。