#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
к вашему вопросу.