我想用个人的细节丰富订单的收集。
假设我已经(示例在json中):
[
{
"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"
}
]有了这些信息,我需要用person的详细信息充实每个对象,因此最终的结果如下:
[
{
"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"
}
}
]用浓缩器实现这一目标有可能吗?
发布于 2018-03-22 14:51:06
嗯,ContentEnricher正是因为这个原因。您收到一条消息,发送充实请求,等待回复并产生输出。
您所要求的关于丰富JSON字符串的内容是一个有点不寻常的任务,并且脱离了范围。我只能建议实现一些服务方法来接受JSON,来进行解析、迭代和修改。在方法的末尾,您将生成一个所需的JSON。这一条实际上可以从@ServiceActivator中用于侦听充实请求消息通道,并返回对replyChannel头的答复。
对于我来说,如何进行JSON解析等等似乎是不可能的。但是,我可以建议查看一下JsonToObjectTransformer,以获得一些POJO的List来进行迭代和修改。然而,对于每个记录来说,一个简单的Map也足够了。要将List<Map>转换回JSON,可以考虑使用ObjectToJsonTransformer。
更新
如果您能够将该JSON隐藏到List<POJO>或List<Map>中,那么splitter-aggregator模式就是适合您的。
不过,我会这样做的:
@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());
}UPDATE2
例如,如果您希望在数据库中一次获得买家列表,那么让我们考虑一下这个解决方案。
如果您的原始列表实际上是JSON,我们可以这样做:
.enrich(e -> e
.requestPayloadExpression("#jsonPath(payload, '$.buyerId')")
.requestChannel(getBuyersChannel())
.headerExpression("buyers", "payload"))jsonPath提取所有buyerId属性并生成其值的List。
getBuyersChannel流必须执行一些查询并返回,例如Map<String, String> - buyerId -> buyer_as_json.这个结果将存储在上面提到的buyers头中。
在这个.enrich()之后,您需要编写一个自定义的.transform()代码,并在这个buyers头上迭代并执行String.replaceFirst("(\" + buyer.getKey() + \",)", "$1" + buyer.getValue())。
如果您的JSON已经是List<POJO>或List<Map>,则可以使用类似的方法,但可以使用Java8Streams:
.<List<Map<?, ?>>>requestPayload(m ->
m.getPayload()
.stream()
.map(entry -> entry.get("buyerId"))
.collect(Collectors.toList()))DB的结果可能类似于Map<String, Map<?, ?>>,您可以执行类似的迭代来扩展与其买家的订单映射。
https://stackoverflow.com/questions/49424895
复制相似问题