私はタイプセーフな方法として、残りのテンプレートでエラー応答を処理したい、春ブーツに新しいです。
私はすでに残りのテンプレートを使用して例外処理を試みたが、それは私の問題を解決しません。または多分私はそれを正しく使用する方法がわかりません。
val restTemplate = RestTemplate() restTemplate.exchange(uri, HttpMethod.POST, payload, UserResponse::class.java) // getting error here because of error response
//このような何か私が実際にしたいです
val restTemplate = RestTemplate() restTemplate.setSuccessEntity(UserResponse::class.java) restTemplate.setErrorEntity(ErrorResponse::class.java) restTemplate.exchange(uri, HttpMethod.POST, payload)
そして、予想される応答は次のようになります
{ "error":{} // null or ErrorResponse Entity object if there is an error "success":{} // null or UserResponse Entity object if there is an error }
- カスタムを定義します
RestTemplateResponseErrorHandler
class MyRestTemplateResponseErrorHandler : ResponseErrorHandler {
override fun hasError(response: ClientHttpResponse): Boolean {
return response.statusCode.is4xxClientError || response.statusCode.is5xxServerError //or sth else depending on your case
}
override fun handleError(response: ClientHttpResponse) {
val msg = response.body.bufferedReader().use(BufferedReader::readText)
throw MyExternalApiException(msg)
}
}
MyExternalApiException
以下のように定義することができます。
class MyExternalApiError(msg: String) : RuntimeException(msg)
- それ作ります
Bean
@Bean
fun responseErrorHandler(): ResponseErrorHandler {
return MyRestTemplateResponseErrorHandler()
}
- 作成するためにそれを使用し
RestTemplate Bean
てRestTemplateBuilder
@Bean
fun restTemplate(restTemplateBuilder: RestTemplateBuilder,
responseErrorHandler: ResponseErrorHandler): RestTemplate {
return restTemplateBuilder
.errorHandler(responseErrorHandler)
.build()
}
- 今、あなたはエラーハンドラが正常に機能しており、あなたが投げることを
MyExternalApiException
外部APIを使用して、作成することができます失敗したときにControllerAdvice
、この例外が発生したときに、特別なエンティティを返すこと。お使いのコントローラが返されますErrorResponse
、あなたが失敗した外部API要求から取得したメッセージを。
@ControllerAdvice
class ApiErrorHandler {
@ExceptionHandler(value = [MyExternalApiException::class])
fun handleExternalApiException(e: MyExternalApiException): ResponseEntity<ErrorResponse> {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.contentType(MediaType.APPLICATION_JSON_UTF8)
.body(ErrorResponse(e.message
?: "External api error"))
}
data class ErrorResponse(val message: String)
成功した要求の場合には、ちょうどあなたの成功のエンティティで正常に戻ります。あなたは両方持っているしたい場合error
やsuccess
、すべての応答のフィールドを、ちょうどこれらのフィールドのいずれかを設定します。error
中ApiErrorHandler
およびsuccess
後restTemplate.exchange()
。
あなたのクラスにマッピングすること、外部エラーではなく、文字列をしたい場合は、ジャクソンズのオブジェクトマッパーや他のライブラリを使用することができます。