在 WebClient onErrorResume 中反序列化没有对象映射器的错误响应
Deserialize error response without object mapper in WebClient onErrorResume
我想知道是否有更好的方法在调用 onErrorResume
时不涉及使用额外 ObjectMapper
的方式在 WebClient 中获取错误响应?
在我的网络客户端中:
import org.springframework.web.reactive.function.client.WebClientResponseException.BadRequest
// ...
.onErrorResume(BadRequest::class.java, badRequestToMyDto())
private fun badRequestToMyDto(): (BadRequest) -> Mono<out MyDto> =
{ it: BadRequest ->
val error = objectMapper.readValue<ErrorResponseDto>(it.responseBodyAsByteArray)
// ...
}
有一个方法.bodyToMono
所以我想知道是否有类似的东西可以在onErrorResume
中使用。
您可以结合使用 retrieve()
和 onStatus
来访问“错误”时的客户端响应。然后,您可以对其调用 bodyToMono
以将响应解组为 java 对象。根据响应主体的内容类型,spring 将使用正确的解码器。例如,如果正文是 json,它将使用 ObjectMapper
进行解组。
WebClient.builder().build()
.get()
.uri("localhost:8080")
.retrieve()
.onStatus(HttpStatus::isError, clientResponse ->
clientResponse.bodyToMono(MyErrorResponse.class)
.flatMap(body -> {
// logic
})
)
我想知道是否有更好的方法在调用 onErrorResume
时不涉及使用额外 ObjectMapper
的方式在 WebClient 中获取错误响应?
在我的网络客户端中:
import org.springframework.web.reactive.function.client.WebClientResponseException.BadRequest
// ...
.onErrorResume(BadRequest::class.java, badRequestToMyDto())
private fun badRequestToMyDto(): (BadRequest) -> Mono<out MyDto> =
{ it: BadRequest ->
val error = objectMapper.readValue<ErrorResponseDto>(it.responseBodyAsByteArray)
// ...
}
有一个方法.bodyToMono
所以我想知道是否有类似的东西可以在onErrorResume
中使用。
您可以结合使用 retrieve()
和 onStatus
来访问“错误”时的客户端响应。然后,您可以对其调用 bodyToMono
以将响应解组为 java 对象。根据响应主体的内容类型,spring 将使用正确的解码器。例如,如果正文是 json,它将使用 ObjectMapper
进行解组。
WebClient.builder().build()
.get()
.uri("localhost:8080")
.retrieve()
.onStatus(HttpStatus::isError, clientResponse ->
clientResponse.bodyToMono(MyErrorResponse.class)
.flatMap(body -> {
// logic
})
)