【问题标题】:How to set onStatus in Spring WebClient builder instance如何在 Spring WebClient 构建器实例中设置 onStatus
【发布时间】:2020-05-07 15:39:42
【问题描述】:

我有很多方法使用 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();
    }

【问题讨论】:

  • 由于retrieve在Webclient中返回一个私有内部类,你必须用你自己的覆盖retrieve()的版本来扩展Webclient,并让它返回你自己的ResponseSpec版本
  • 实际上,由于某种原因,该包中的所有类似乎都是私有的,所以不要认为你可以......

标签: java spring spring-webflux spring-webclient


【解决方案1】:

找到了解决方案: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);
    }

}

【讨论】:

    猜你喜欢
    • 2020-07-12
    • 2021-12-19
    • 2020-06-15
    • 2018-02-24
    • 2022-09-23
    • 1970-01-01
    • 2018-08-06
    • 2021-03-28
    • 2019-04-11
    相关资源
    最近更新 更多