Java 丰富收藏

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"

我想用人员详细信息丰富订单收集

假设我有一个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"
   }
]
有了这些信息,我需要用人物细节丰富每个对象,因此最终结果如下:

[
   {
      "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:[],买家:[]},但我确实希望避免使用此解决方案。