Spring webClient генерирует исключение NullPointException после прохождения фильтра - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу сделать обработку исключений. Когда StatusCode 200, но не нужное тело.

Чтобы сделать обработку глобальной, я использую фильтр.

ниже приведен код.

public WebClient webClient() {
    return WebClient.builder()
            .filter(ExchangeFilterFunction.ofResponseProcessor(response -> {

                // statusCode 400 || 500
                if (response.statusCode().isError()) {
                    return response.bodyToMono(String.class)
                            .flatMap(body ->
                                    Mono.error(new ExternalClientException(body))
                                    )
                            );
                }

                // statusCode 200
                return  response.bodyToMono(String.class)
                        .flatMap(body -> {
                            if (YanoljaConstants.EMPTY_BODY.contains(body)) {
                                return Mono.error(new ExternalClientException(body))
                                        .cast(ClientResponse.class);
                            }
                            return Mono.just(response); // normal
                        });
            }))
            .build();
}

И фактический клиент код показан ниже.

public Foo getPlace(int no) {
    return Objects.requireNonNull(contentsApiV2Client.get()
            .uri(uriBuilder -> uriBuilder.path("/path").build(no))
            .retrieve()
            .bodyToMono(new ParameterizedTypeReference<Foo>() {
            })
            .block());
}

При использовании этого NullPointerException возникает при нормальном ответе после прохождения фильтра (return Mono#just(response)).

Я хочу очистить это выпуск.

Для справки приведенный ниже код работает нормально.

public WebClient webClient() {
    return WebClient.builder()
            .filter(ExchangeFilterFunction.ofResponseProcessor(response -> {
                // statusCode 400 || 500
                if (response.statusCode().isError()) {
                    return response.bodyToMono(String.class)
                            .flatMap(body ->
                                    Mono.error(new ExternalClientException(body))
                                    )
                            );
                }
                return Mono.just(response); // normal
            }))
            .build();
}

Спасибо. жду вашего ответа!


Решить!

public WebClient webClient() {
    return WebClient.builder()
            .filter(ExchangeFilterFunction.ofResponseProcessor(response -> {

                // statusCode 400 || 500
                if (response.statusCode().isError()) {
                    return response.bodyToMono(String.class)
                            .flatMap(body ->
                                    Mono.error(new ExternalClientException(body))
                                    )
                            );
                }

                // statusCode 200
                return  response.bodyToMono(String.class)
                        .flatMap(body -> {
                            if (YanoljaConstants.EMPTY_BODY.contains(body)) {
                                return Mono.error(new ExternalClientException(body))
                                        .cast(ClientResponse.class);
                            }
                            return Mono.just(ClientResponse.create(HttpStatus.OK)
                                        .header(HttpHeaders.CONTENT_TYPE, "application/json")
                                        .body(body)
                                        .build()); // normal
                        });
            }))
            .build();
}

Я понял, что при запуске метода monoTobody он расходуется, и значение исчезает. Поэтому я решил это, создав новый ClientResponse.

Спасибо.

...