当前位置: 首页 > 知识库问答 >
问题:

如何在包装类中合并两个spring boot微服务响应

裴承安
2023-03-14

我是Spring boot微服务和探索webflux框架的新手。我试图将来自两个微服务的响应合并到一个包装类中,以获得正确的JSON响应。下面是详细的场景。

微服务1:http://localhost:8080/该微服务的控制器中的产品其返回流量和我得到

[
    {
        "id": "5b2fd1e5f57d731904c54ad7",
        "name": "Product3",
        "price": "30"
    },
    {
        "id": "5b2fd1e4j9fdj3kds9djkj43",
        "name": "Product2",
        "price": "20"
    }
]

微服务2:http://localhost:8181/person In controller of second Service其返回单声道,对此我也得到如下正确响应,

{
    "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"
        }
    ]

}

现在,我有了一个产品类和个人类的父类实体,我通过WebClient调用上述两个微服务,并使用Flux进行响应。concat(人员响应、产品响应);其中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()方法。

更新

目前我将产品微服务称为,

clientProd.get().uri(productUrl)
                .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .retrieve().bodyToFlux(Product.class).onErrorReturn(new Product());

并且类似地,

clientPerson.get().uri(personUri)
                .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .retrieve().bodyToMono(Person.class).onErrorReturn(new Person());

连接是使用Flux.concat(),

提前致谢。

共有1个答案

明阳旭
2023-03-14

正确的方法是将这些响应映射到类:

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
}

这样,您就有了三种不同的POJOs,您可以根据需要(调用的API类型)使用它们。

 类似资料:
  • 我有两个微服务,用户微服务和订单微服务。 因此客户端只需要调用一个endpointhttp://localhost:9090/api/getdetail 我们如何在API网关级别实现这一点?

  • null 最终产品将是,它将具有图像、描述、评分(满分为5分)和许多评论。 在微服务架构中,应该在什么位置组合多个微服务的响应? 大约1: MVC/REST API接近APIGateway API网关对所有微服务进行异步调用 响应将返回到MVC/WebAPI。在这里可以执行响应的合成。 大约2: MVC/REST API接近Apigateway API网关对产品微服务进行异步调用。 Product

  • 这种功能性应该如何实施?有关于这方面的指导方针或文章吗?

  • 我试着将两个div并排放置,两个div之间的间距为20px。div在包装内,宽度为800px。左div是250px,右div是550px,但当然,如果我在它们之间加上20px的边距,总宽度将增加到800px以上。有没有办法强制右div宽度为550px-20px的余量? CSS 超文本标记语言 我的意思是我必须手动减小宽度还是有更好的解决方案? jsfiddle:https://jsfiddle.n

  • 问题内容: 我有两个数组。 我需要合并这些数组,并在下拉列表中显示为 我怎么能使用swift.im新手来快速获得此结果,有人可以帮忙吗? 问题答案: 压缩数组并连接结果:

  • 我在我的项目中有两个活动。在我的DrawerActivity中,我添加了导航抽屉,在其他活动即TabActivity中,我有片段列表。我试图在DrawerActivity中显示TabActivity的内容。是否有可能这样做,或者我有遵循另一种方法。我是新手开发者,请帮帮我。 draweractivity.java //我的第二个活动是TabActivity,这里我想在draweractivity中