gpt4 book ai didi

java - 如何处理Rest模板api错误响应并转换为类型安全的Json?

转载 作者:行者123 更新时间:2023-11-30 01:46:07 27 4
gpt4 key购买 nike

我是 Spring Boot 新手,我想以类型安全的方式处理剩余模板中的错误响应。

我已经尝试使用剩余模板进行异常处理,但它不能解决我的问题。或者也许我不知道如何正确使用它。

val RestTemplate = RestTemplate()
restTemplate.exchange(uri, HttpMethod.POST, Payload, UserResponse::class.java)//由于错误响应而出现错误

//我真正想要的是这样的

val RestTemplate = RestTemplate()
restTemplate.setSuccessEntity(UserResponse::class.java)
restTemplate.setErrorEntity(ErrorResponse::class.java)
restTemplate.exchange(uri,HttpMethod.POST,有效负载)

预期的响应会是这样的

{
"error":{}//如果出现错误,则为 null 或 ErrorResponse 实体对象
"success":{}//如果出现错误,则返回 null 或 UserResponse 实体对象
}

最佳答案

  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)
  • 使其成为Bean
  • @Bean
    fun responseErrorHandler(): ResponseErrorHandler {
    return MyRestTemplateResponseErrorHandler()
    }
  • 使用它通过 RestTemplateBuilder 创建 RestTemplate Bean
  • @Bean
    fun restTemplate(restTemplateBuilder: RestTemplateBuilder,
    responseErrorHandler: ResponseErrorHandler): RestTemplate {
    return restTemplateBuilder
    .errorHandler(responseErrorHandler)
    .build()
    }
  • 既然您的错误处理程序正常工作,并且在外部 api 失败时抛出 MyExternalApiException,您可以创建 ControllerAdvice 以在发生此异常时返回特殊实体。您的 Controller 将返回 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 字段,只需设置其中一个字段即可。 ApiErrorHandler 中的 errorrestTemplate.exchange() 之后的 success

    如果您希望将外部错误映射到您的类,而不是字符串,您可以使用 jacksons 对象映射器或其他库。

    关于java - 如何处理Rest模板api错误响应并转换为类型安全的Json?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57912394/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com