如何在包装器 class 中合并两个 spring 引导微服务响应
How to merge two spring boot micro-services response in wrapper class
我是 Spring 引导微服务和探索 webflux 框架的新手。我正在尝试将来自两个微服务的响应合并到一个包装器 class 中,以便在适当的 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,它将上述两个微服务的结果组合在一个包装器中 class,如下所示,
{
{
"id": ehj8u3jmodmdj,
"name": "PersonXXX",
"email": "PersonXXX@somecorp.com"
},
[
{
"id": "5b2fd1e5f57d731904c54ad7",
"name": "Product3",
"price": "30"
},
{
"id": "5b2fd1e4j9fdj3kds9djkj43",
"name": "Product2",
"price": "20"
}
]
}
现在我有一个用于产品和人员 class 的父 class 实体,我正在通过 WebClient 调用上述两个微服务并使用 [=47= 连接响应](personResp, productResp);其中 personResp 是 Mono 类型,productResp 是 Flux 类型,但我仅在文本中而不是在 JSON 中收到此(第 3 个)微服务的响应,如下所示,
data:{"id":ehj8u3jmodmdj,"name":"PersonXXX","email":"PersonXXX@somecorp.com"}
data:{"id":"5b2fd1e5f57d731904c54ad7","name":"Product3","price":"30"}
data:{"id":"5b2fd1e4j9fdj3kds9djkj43","name":"Product2","price":"20"}
这可能是因为每个元素都作为不同的流发送。
所以只想知道是否有任何方法可以将两个响应组合在一个包装器中 class,而无需在对这两个服务的任何调用上使用 block() 方法。
更新
目前我称产品微服务为,
clientProd.get().uri(productUrl)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.retrieve().bodyToFlux(Product.class).onErrorReturn(new Product());
与 Person 服务类似,
clientPerson.get().uri(personUri)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.retrieve().bodyToMono(Person.class).onErrorReturn(new Person());
连接使用 Flux.concat(),
提前致谢。
正确的方法是将这些响应映射到 类:
public class Product{
private Long id;
private String name;
private Double price;
//constructors, getters, setters
}
public class Person{
private Long id;
private String name;
private String mail;
//constructors, getters, setters
}
public class Entity{
private Person person;
private List <Product> products;
//constructors, getters, setters
}
这样你就有了三个不同的POJO
,你可以根据需要使用(你调用的API的类型)。
我是 Spring 引导微服务和探索 webflux 框架的新手。我正在尝试将来自两个微服务的响应合并到一个包装器 class 中,以便在适当的 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,它将上述两个微服务的结果组合在一个包装器中 class,如下所示,
{
{
"id": ehj8u3jmodmdj,
"name": "PersonXXX",
"email": "PersonXXX@somecorp.com"
},
[
{
"id": "5b2fd1e5f57d731904c54ad7",
"name": "Product3",
"price": "30"
},
{
"id": "5b2fd1e4j9fdj3kds9djkj43",
"name": "Product2",
"price": "20"
}
]
}
现在我有一个用于产品和人员 class 的父 class 实体,我正在通过 WebClient 调用上述两个微服务并使用 [=47= 连接响应](personResp, productResp);其中 personResp 是 Mono 类型,productResp 是 Flux 类型,但我仅在文本中而不是在 JSON 中收到此(第 3 个)微服务的响应,如下所示,
data:{"id":ehj8u3jmodmdj,"name":"PersonXXX","email":"PersonXXX@somecorp.com"}
data:{"id":"5b2fd1e5f57d731904c54ad7","name":"Product3","price":"30"}
data:{"id":"5b2fd1e4j9fdj3kds9djkj43","name":"Product2","price":"20"}
这可能是因为每个元素都作为不同的流发送。
所以只想知道是否有任何方法可以将两个响应组合在一个包装器中 class,而无需在对这两个服务的任何调用上使用 block() 方法。
更新
目前我称产品微服务为,
clientProd.get().uri(productUrl)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.retrieve().bodyToFlux(Product.class).onErrorReturn(new Product());
与 Person 服务类似,
clientPerson.get().uri(personUri)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.retrieve().bodyToMono(Person.class).onErrorReturn(new Person());
连接使用 Flux.concat(),
提前致谢。
正确的方法是将这些响应映射到 类:
public class Product{
private Long id;
private String name;
private Double price;
//constructors, getters, setters
}
public class Person{
private Long id;
private String name;
private String mail;
//constructors, getters, setters
}
public class Entity{
private Person person;
private List <Product> products;
//constructors, getters, setters
}
这样你就有了三个不同的POJO
,你可以根据需要使用(你调用的API的类型)。