Проблемы с WebClient, возвращающим пустой ответ

#java #spring-webflux #spring-resttemplate

#java #spring-webflux #spring-resttemplate

Вопрос:

Я работаю над проектом, в котором до сих пор использовался org.springframework.web.client.RestTemplate Недавно я понял, что этот класс устарел в пользу платформы Asynch org.springframework.web.reactive.function.client.WebClient . Теперь я полностью поддерживаю это, поскольку мое приложение страдает от длительных задержек при ожидании ответов от вызовов RestTemplate (GET) (в это время я мог бы выполнять работу с базой данных и т.д.).
Проблема, с которой я сталкиваюсь сейчас, заключается в том, что если я выполняю вызов, подобный:

 final Mono<String> call = webClient
        .get()
        .uri("/base/recordPath/1?format=json")
        .header("Content-Type", MediaType.APPLICATION_JSON_VALUE)
        .accept(MediaType.APPLICATION_JSON)
        .retrieve()
        .bodyToMono(String.class)
  

когда я выполняю последующий вызов, подобный:
System.out.println(call.block());
Я получаю ожидаемый результат (строковую версию заполненного объекта Json).
однако, если я изменю предыдущий вызов на (что я хочу сделать!):

 final Mono<JsonObject> call = webClient
        .get()
        .uri("/base/recordPath/1?format=json")
        .header("Content-Type", MediaType.APPLICATION_JSON_VALUE)
        .accept(MediaType.APPLICATION_JSON)
        .retrieve()
        .bodyToMono(JsonObject.class)
  

когда я делаю:
System.out.println(call.block());
Я просто получаю {} вместо заполненного JSONObject

Похоже, bodyToMono() не сделал того, что «я» ожидал

Когда я использовал RestTemplate, был способ зарегистрировать сериализаторы с шаблоном (хотя это не было необходимо для JsonObject ), это также необходимо с WebClient? Если да, то как вы это делаете?
Я был бы признателен за помощь.

Спасибо

Счет

Примечание. Я не уверен, имеет ли это какое-либо отношение, но конечная точка rest, к которой я обращаюсь, имеет ограничение IP, поэтому, если каким-то образом WebClient изменить исходный IP, это может иметь некоторый эффект. Хотя я бы подумал, что это будет больше похоже на 4** какой-то, я не вижу ни одного из них! Или, возможно, проблема с типом носителя, поскольку он проходит через DMZ, где guardian может изменять «несанкционированный» запрос, например, с application/json на text/* .

Другой момент, который может иметь значение, заключается в том, что для успешного запуска приложения необходимо запустить его со следующим свойством: spring.main.web-application-type=none

Обновить
Теперь мое приложение запущено, хотя и не так, как я хочу!
Проблема, по-видимому, заключалась в транзитивных зависимостях, импортированных командным pom, который я должен использовать (как родительский pom). Теперь я получаю успешное начало проекта. Но все равно обнаруживаю, что объект json (который теперь Jackson) по-прежнему пуст (как сообщает object.isEmpty() ).
мои зависимости / версии теперь:
org.springframework:5.2.8.RELEASE
org.springframework.boot:2.3.3.RELEASE
com.fasterxml.jackson:2.11.2
Я знаю, что я борюсь с родительским pom, который противоречит тому, что я пытаюсь сделать, но хотел бы знать, какие зависимости мне действительно нужны

Комментарии:

1. RestTemplate не является устаревшим его асинхронный двойник AsyncRestTemplate является устаревшим в пользу WebClient . Также вы знаете, что при использовании block() вы в основном теряете преимущества WebClient ? Теперь вы снова находитесь в состоянии блокировки. При этом, что JsonObject вы используете (какой пакет). WebClient поддерживает только Jackson, поэтому, если это GSON, он не будет работать.

2. Я знал, что использование block теряло преимущества WebClient, это был шаг к более полному решению. Я также использовал GSON JSONObject, так что, похоже, это может быть проблемой. Если бы вы могли записать это как ответ, вместе со ссылкой на некоторую документацию, в которой говорится, что Jackson является единственным поддерживаемым Json, я приму это как исключенный ответ. Спасибо.

3. также org.json это не Jackson и не GSON. Поэтому, пожалуйста, сделайте это явным в вашем вопросе.

4. Я не знал, что использую org.json , хотя mvn dependency:tree говорит мне, что это com.fasterxml.jackson.datatype:jackson-datatype-json-org:jar:2.11.2 затягивает org.json:json:jar:20190722:compile , не означает ли это, что org.json это часть jackson? Или я что-то упускаю?

5. Это не часть Jackson. Эта зависимость подключает дополнительную зависимость, благодаря которой Джексон узнает о org.json материале и разрешает его преобразование. Что заставляет меня задуматься, тогда, когда вы переключаетесь на WebClient , он перестает работать. Меняете ли вы зависимости для работы с WebClient ? Попробуйте сравнить зависимости before и after и посмотреть, в чем различия. Пожалуйста, также добавьте свой pom.xml к вашему вопросу.