Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理Rest模板api错误响应并转换为类型安全的Json?_Java_Spring Boot_Exception_Kotlin - Fatal编程技术网

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

Java 如何处理Rest模板api错误响应并转换为类型安全的Json?,java,spring-boot,exception,kotlin,Java,Spring Boot,Exception,Kotlin,我是SpringBoot新手,我想以类型安全的方式处理rest模板中的错误响应 我已经尝试过用rest模板处理异常,但它并没有解决我的问题。或者我不知道如何正确使用它 val restTemplate=restTemplate() restemplate.exchange(uri,HttpMethod.POST,payload,UserResponse::class.java)//由于错误响应而在此处获取错误 //我真正想要的是这样的东西 val restTemplate=restTemplat

我是SpringBoot新手,我想以类型安全的方式处理rest模板中的错误响应

我已经尝试过用rest模板处理异常,但它并没有解决我的问题。或者我不知道如何正确使用它

val restTemplate=restTemplate()
restemplate.exchange(uri,HttpMethod.POST,payload,UserResponse::class.java)//由于错误响应而在此处获取错误

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

val restTemplate=restTemplate()
restTemplate.setSuccessEntity(UserResponse::class.java)
setErrorEntity(ErrorResponse::class.java)
restemplate.exchange(uri、HttpMethod.POST、负载)

预期的反应是这样的

{
“error”:{}//null或ErrorResponse实体对象(如果有错误)
“成功”:{}//null或UserResponse实体对象(如果有错误)
}

  • 定义自定义
    RestTemplateResponseErrorHandler
  • 类MyRestTemplateResponseErrorHandler:ResponseErrorHandler{
    覆盖错误(响应:ClientHttpResponse):布尔值{
    返回response.statusCode.is4xclientorror | | | response.statusCode.is5xxServerError//或其他内容,具体取决于您的情况
    }
    覆盖趣味手柄错误(响应:ClientHttpResponse){
    val msg=response.body.bufferedReader().use(bufferedReader::readText)
    抛出MyExternalAPIEException(msg)
    }
    }
    
    MyExternalapieException
    的定义如下:

    类MyExternalApiError(msg:String):运行时异常(msg)
    
  • 让它成为
    Bean
  • @Bean
    fun responseErrorHandler():responseErrorHandler{
    返回MyRestTemplateResponseErrorHandler()
    }
    
  • 使用它可以使用
    restemplatebuilder
  • @Bean
    有趣的restTemplate(restTemplateBuilder:restTemplateBuilder,
    responseErrorHandler:responseErrorHandler):RestTemplate{
    返回restTemplateBuilder
    .errorHandler(responseErrorHandler)
    .build()
    }
    
  • 既然错误处理程序工作正常,并且在外部api失败时抛出了
    MyExternalApiException
    ,那么您可以创建
    ControllerAdvice
    ,以便在发生此异常时返回特殊实体。控制器将返回
    ErrorResponse
    ,其中包含从失败的外部api请求中获得的消息
  • @ControllerAdvice
    类ApiErrorHandler{
    @ExceptionHandler(值=[MyExternalApieException::class])
    FunHandleExternalapieException(e:MyExternalapieException):响应性{
    返回ResponseEntity.status(未找到HttpStatus.NOT_)
    .contentType(MediaType.APPLICATION\u JSON\u UTF8)
    .正文(错误响应(e.message
    ?:“外部api错误”))
    }
    数据类错误响应(val消息:字符串)
    
    如果请求成功,请与成功的实体一起正常返回。 如果您想在所有响应中同时包含
    error
    success
    字段,只需在
    apirorhandler
    success
    中设置其中一个字段


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

    响应中的
    错误
    的内容应该是什么?是否希望包含来自外部api的错误?是的,例如,如果外部api给出一些json错误响应,我希望使用我的d将其转换为jsonefined ErrorResonse.java非常优雅的答案,这确实回答了我的问题,但不幸的是,我无法投票,因为我的分数很低。你可以只接受一个“勾号”作为答案。提前谢谢