Я новичок в загрузочных микросервисах Spring и изучаю инфраструктуру webflux. Я пытаюсь объединить ответ от двух микросервисов в один класс-оболочку, чтобы получить ответ в правильном JSON. Ниже подробно описан сценарий.
Микро-Сервис 1: http://localhost:8080/products
в контроллере этого микросервиса его возвращают Flux и я получаю
[
{
"id": "5b2fd1e5f57d731904c54ad7",
"name": "Product3",
"price": "30"
},
{
"id": "5b2fd1e4j9fdj3kds9djkj43",
"name": "Product2",
"price": "20"
}
]
Микро-Сервис 2: http://localhost:8181/person
В контроллере второго сервиса возвращается Mono, и за это я получаю правильный ответ, как показано ниже,
{
"id": ehj8u3jmodmdj,
"name": "PersonXXX",
"email": "PersonXXX@somecorp.com"
}
Теперь я хочу создать еще один микросервис http://localhost:8282/personproduct, который должен объединить результат двух вышеуказанных микросервисов в классе оболочки, как показано ниже,
{
{
"id": ehj8u3jmodmdj,
"name": "PersonXXX",
"email": "PersonXXX@somecorp.com"
},
[
{
"id": "5b2fd1e5f57d731904c54ad7",
"name": "Product3",
"price": "30"
},
{
"id": "5b2fd1e4j9fdj3kds9djkj43",
"name": "Product2",
"price": "20"
}
]
}
Сейчас у меня есть объект Entity для родительского класса и класса Product, и я вызываю оба вышеупомянутых микро-сервиса через WebClient и объединяю ответ, используя Flux.concat (personResp, productResp); где personResp имеет тип Mono, а productResp имеет тип Flux, но я получаю ответ этого (третьего) микросервиса только в текстовом, а не в JSON, как показано ниже,
data:{"id":ehj8u3jmodmdj,"name":"PersonXXX","email":"PersonXXX@somecorp.com"}
data:{"id":"5b2fd1e5f57d731904c54ad7","name":"Product3","price":"30"}
data:{"id":"5b2fd1e4j9fdj3kds9djkj43","name":"Product2","price":"20"}
Это может быть связано с тем, что каждый элемент отправляется как отдельный поток.
Так что просто хочу знать, есть ли способ объединить два ответа в одном классе-обертке без использования метода block () для каких-либо вызовов этих двух служб.
UPDATE
В настоящее время я называю продукт microservice as,
clientProd.get().uri(productUrl)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.retrieve().bodyToFlux(Product.class).onErrorReturn(new Product());
и аналогично Person service как,
clientPerson.get().uri(personUri)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.retrieve().bodyToMono(Person.class).onErrorReturn(new Person());
И объединение использует Flux.concat (),
Заранее спасибо.