どのように残りのテンプレートAPIエラー応答を処理し、安全なJSONを入力して変換するには?

スカイワニ:

私はタイプセーフな方法として、残りのテンプレートでエラー応答を処理したい、春ブーツに新しいです。

私はすでに残りのテンプレートを使用して例外処理を試みたが、それは私の問題を解決しません。または多分私はそれを正しく使用する方法がわかりません。

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 }

マチェイMoscicki:
  1. カスタムを定義します 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)
  1. それ作ります Bean
@Bean
fun responseErrorHandler(): ResponseErrorHandler {
  return MyRestTemplateResponseErrorHandler()
}
  1. 作成するためにそれを使用しRestTemplate BeanRestTemplateBuilder
@Bean
fun restTemplate(restTemplateBuilder: RestTemplateBuilder,
                     responseErrorHandler: ResponseErrorHandler): RestTemplate {
        return restTemplateBuilder
                .errorHandler(responseErrorHandler)
                .build()
}
  1. 今、あなたはエラーハンドラが正常に機能しており、あなたが投げることを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)

成功した要求の場合には、ちょうどあなたの成功のエンティティで正常に戻ります。あなたは両方持っているしたい場合errorsuccess、すべての応答のフィールドを、ちょうどこれらのフィールドのいずれかを設定します。errorApiErrorHandlerおよびsuccessrestTemplate.exchange()

あなたのクラスにマッピングすること、外部エラーではなく、文字列をしたい場合は、ジャクソンズのオブジェクトマッパーや他のライブラリを使用することができます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=334870&siteId=1