Java 丰富收藏
我想用人员详细信息丰富订单收集 假设我有一个json示例:Java 丰富收藏,java,spring,spring-integration,spring-messaging,eai,Java,Spring,Spring Integration,Spring Messaging,Eai,我想用人员详细信息丰富订单收集 假设我有一个json示例: [ { "orderId": 123, "quantity": 5, "buyerId": "84aa820f-2301-4d01-8c4c-2b71204da7dd" }, { "orderId": 124, "quantity": 5, "buyerId": "7158a748-dfd0-47e5-b620-e8ca4d3ac84d"
[
{
"orderId": 123,
"quantity": 5,
"buyerId": "84aa820f-2301-4d01-8c4c-2b71204da7dd"
},
{
"orderId": 124,
"quantity": 5,
"buyerId": "7158a748-dfd0-47e5-b620-e8ca4d3ac84d"
}
]
现在,我想提取所有买家标识符以命中其他消息端点,因此我将得到以下结果:
[
{
"personId": "84aa820f-2301-4d01-8c4c-2b71204da7dd",
"name": "Johny",
"surname": "Bravo"
},
{
"personId": "7158a748-dfd0-47e5-b620-e8ca4d3ac84d",
"name": "Felica",
"surname": "Good"
}
]
有了这些信息,我需要用人物细节丰富每个对象,因此最终结果如下:
[
{
"orderId": 123,
"quantity": 5,
"buyerId": "84aa820f-2301-4d01-8c4c-2b71204da7dd",
"buyer": {
"personId": "84aa820f-2301-4d01-8c4c-2b71204da7dd",
"name": "Johny",
"surname": "Bravo"
}
},
{
"orderId": 124,
"quantity": 5,
"buyerId": "7158a748-dfd0-47e5-b620-e8ca4d3ac84d",
"buyer": {
"personId": "7158a748-dfd0-47e5-b620-e8ca4d3ac84d",
"name": "Felica",
"surname": "Good"
}
}
]
.enrich(e -> e
.requestPayloadExpression("#jsonPath(payload, '$.buyerId')")
.requestChannel(getBuyersChannel())
.headerExpression("buyers", "payload"))
使用Enricher可以实现这一点吗?好吧,ContentEnricher正是出于这个原因。您接收消息、发送请求、等待回复并生成输出
关于丰富JSON字符串,您所问的是一项有点不寻常的任务,它来自Spring集成范围。我只能建议实现一些服务方法来接受JSON,进行解析、迭代和修改。在方法的末尾,您将生成所需的JSON。这一个确实可以从@ServiceActivator中使用,以侦听enrich请求消息通道并返回reply到replyChannel标头
对我来说,如何进行JSON解析等似乎是不可能的。但是,我可以建议查看JsonToObjectTransformer,以获得一些POJO的列表,以进行迭代和修改。但是,每个记录的简单映射也足够了。为了从列表中转换回JSON,可以考虑使用ObjuttoJSONTRONCE.
更新
如果您能够将JSON转换为列表,那么拆分器聚合器模式适合您
不过,我会这样做:
@Bean
public IntegrationFlow enrichJson() {
return f -> f
.transform(Transformers.fromJson(List.class))
.split()
.channel(c -> c.executor(Executors.newCachedThreadPool()))
.enrich(e -> e
.requestPayloadExpression("payload.buyerId")
.requestChannel(getBuyerChannel())
.propertyExpression("buyer", "payload"))
.aggregate()
.transform(Transformers.toJson());
}
更新2
如果你喜欢通过一个数据库来获取买家列表,那么,让我们考虑一下这个解决方案。
如果您的原始列表真的是JSON,我们可以这样做:
[
{
"orderId": 123,
"quantity": 5,
"buyerId": "84aa820f-2301-4d01-8c4c-2b71204da7dd",
"buyer": {
"personId": "84aa820f-2301-4d01-8c4c-2b71204da7dd",
"name": "Johny",
"surname": "Bravo"
}
},
{
"orderId": 124,
"quantity": 5,
"buyerId": "7158a748-dfd0-47e5-b620-e8ca4d3ac84d",
"buyer": {
"personId": "7158a748-dfd0-47e5-b620-e8ca4d3ac84d",
"name": "Felica",
"surname": "Good"
}
}
]
.enrich(e -> e
.requestPayloadExpression("#jsonPath(payload, '$.buyerId')")
.requestChannel(getBuyersChannel())
.headerExpression("buyers", "payload"))
jsonPath提取所有buyerId属性并生成它们的值列表
getBuyerChannel流必须执行一些查询并返回,例如Map-buyerId->buyer\u as\u json。此结果将存储在上述买方标题中
在此之后,您需要编写一个自定义的.transform代码并迭代该买家标题并执行String.replaceFirst\+buyer.getKey+\,$1+buyer.getValue
如果您的JSON已经是List或List,您可以使用类似的方法,但使用Java 8流:
.<List<Map<?, ?>>>requestPayload(m ->
m.getPayload()
.stream()
.map(entry -> entry.get("buyerId"))
.collect(Collectors.toList()))
DB的结果可能像MapWell json只是一个例子,也可能是HashMap或POJO:困扰我的主要问题是如何使用表达式语言提取所有买家ID,以及如何在收到回复消息时将其映射回。如果你能给我举个例子,我会非常感激:请看我答案中的更新。谢谢你的例子,这对于命令来说非常有用,因为执行时间不需要太长。但当我需要一步完成查询时,查询的情况又如何呢。就像我需要一次获得所有的BuyerID,用一条消息请求所有买家,然后合并回复消息。可能吗?是的。通过一些自定义代码,任何事情都是可能的。我需要多想想。但还是要注意我是如何将工作与执行者通道并行的。也许这对你来说就足够了,而不是对所有的买家一刀切。我认为这种充实的方式不是不标准的。我可以将买家列表添加为{orders:[],买家:[]},但我确实希望避免使用此解决方案。