Java 如何处理Rest模板api错误响应并转换为类型安全的Json?
我是SpringBoot新手,我想以类型安全的方式处理rest模板中的错误响应 我已经尝试过用rest模板处理异常,但它并没有解决我的问题。或者我不知道如何正确使用它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
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()
}
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非常优雅的答案,这确实回答了我的问题,但不幸的是,我无法投票,因为我的分数很低。你可以只接受一个“勾号”作为答案。提前谢谢