首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >丰富馆藏

丰富馆藏
EN

Stack Overflow用户
提问于 2018-03-22 09:26:52
回答 1查看 286关注 0票数 0

我想用个人的细节丰富订单的收集。

假设我已经(示例在json中):

代码语言:javascript
复制
[
   {
      "orderId": 123,
      "quantity": 5,
      "buyerId": "84aa820f-2301-4d01-8c4c-2b71204da7dd" 
   },
   {
      "orderId": 124,
      "quantity": 5,
      "buyerId": "7158a748-dfd0-47e5-b620-e8ca4d3ac84d" 
   }
]

现在,我希望提取所有买方标识符,以访问其他消息端点,因此我将得到以下结果:

代码语言:javascript
复制
[
   {
       "personId": "84aa820f-2301-4d01-8c4c-2b71204da7dd",
       "name": "Johny",
       "surname": "Bravo"
   },
   {
       "personId": "7158a748-dfd0-47e5-b620-e8ca4d3ac84d",
       "name": "Felica",
       "surname": "Good"
   }
]

有了这些信息,我需要用person的详细信息充实每个对象,因此最终的结果如下:

代码语言:javascript
复制
[
   {
      "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"
      }
   }
]

用浓缩器实现这一目标有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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模式就是适合您的。

不过,我会这样做的:

代码语言:javascript
复制
    @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,我们可以这样做:

代码语言:javascript
复制
     .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:

代码语言:javascript
复制
.<List<Map<?, ?>>>requestPayload(m ->
            m.getPayload()
                    .stream()
                    .map(entry -> entry.get("buyerId"))
                    .collect(Collectors.toList()))

DB的结果可能类似于Map<String, Map<?, ?>>,您可以执行类似的迭代来扩展与其买家的订单映射。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49424895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档