java - 如何在 Spring WebClient 构建器实例中设置 onStatus
问题描述
我有很多使用 Spring WebClient 中的 onStatus API 的方法:
@Override
public Mono<Accommodation> createAccommodation(CreateAccommodation create) {
return webClient
.post()
.contentType(APPLICATION_JSON)
.bodyValue(create)
.retrieve()
.onStatus(HttpStatus::isError,
clientResponse -> clientResponse
.bodyToMono(ApiErrorResponse.class)
.flatMap(errorResponse -> Mono.error(new ResponseStatusException(
HttpStatus.valueOf(errorResponse.getStatus()),
errorResponse.getMessage()
))))
.bodyToMono(Accommodation.class);
}
我想做的是避免在每个 WebClient 调用中都使用“onStatus”。
构建 WebClient 实例时有没有办法设置它?你能举一些例子吗?
这是我的 WebClient 实例:
public AccommodationServiceClientImpl(WebClient.Builder builder) {
this.webClient = builder
.baseUrl("lb://accommodation-service/api/v1/accommodations")
.build();
}
解决方案
找到了解决方案: ExchangeFilterFunction.ofResponseProcessor 似乎是我正在寻找的。
@Configuration
public class WebClientConfig {
@Bean
@LoadBalanced
public WebClient.Builder webClientBuilder(){
return WebClient
.builder()
.filter(ExchangeFilterFunction.ofResponseProcessor(this::renderApiErrorResponse));
}
private Mono<ClientResponse> renderApiErrorResponse(ClientResponse clientResponse) {
if(clientResponse.statusCode().isError()){
return clientResponse.bodyToMono(ApiErrorResponse.class)
.flatMap(apiErrorResponse -> Mono.error(new ResponseStatusException(
clientResponse.statusCode(),
apiErrorResponse.getMessage()
)));
}
return Mono.just(clientResponse);
}
}
推荐阅读
- python-3.x - 使用 MLPClassifier 'score' 方法时出现“预期类数组,得到数组”错误
- python-3.x - 如何关注实际上是点击按钮的链接
- node.js - 如何将 vue.js 客户端添加到现有的 node.js api?
- azure-devops - 为合并 4 个不同构建工件的拉取请求发布选择正确的构建工件
- amazon-web-services - 通过 CDK 中的 ARN 将 eventSource 添加到 Lambda
- angular - 如何在嵌套表单数组中全选和取消全选?
- python - 切换到同一窗口内的弹出窗口
- php - PHP 文档 @example 示例
- c# - ASP.NET MVC - 将动态 ExpandoObject 从控制器传递到视图时出现 RuntimeBinderException
- html - 在所有页面上打印固定的页眉和页脚