0

我想用个人详细信息丰富订单的收集。

假设我已经(示例在 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"
      }
   }
]

使用浓缩器可以实现这一目标吗?

4

1 回答 1

1

嗯,ContentEnricher正是这个原因。您收到一条消息,发送丰富请求,等待回复并产生输出。

您所询问的有关丰富 JSON 字符串的内容是一项不寻常的任务,并且超出了 Spring Integration 范围。我只能建议实现一些服务方法来接受该 JSON,进行解析、迭代和修改。在方法结束时,您将生成所需的 JSON。这个真的可以用来@ServiceActivator监听丰富的请求消息通道并返回响应replyChannel头。

如何进行 JSON 解析等对我来说似乎不在问题范围内。但是,我可以建议查看一些 POJO 以进行迭代和修改JsonToObjectTransformerList然而,一个简单Map的记录也足够了。要从 转换回List<Map>JSON,您可以考虑使用ObjectToJsonTransformer.

更新

如果您能够将该 JSON 转换为List<POJO>or 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());
    }

更新2

例如,如果您希望通过数据库一次性获取买家列表,那么让我们考虑这个解决方案。

如果您的原始列表确实是 JSON,我们可以执行以下操作:

     .enrich(e -> e
                    .requestPayloadExpression("#jsonPath(payload, '$.buyerId')")
                    .requestChannel(getBuyersChannel())
                    .headerExpression("buyers", "payload"))

jsonPath提取所有buyerId属性并生成它们的List值。

流程必须执行一些查询并返回,getBuyersChannel例如 a Map<String, String>- buyerId -> buyer_as_json。该结果将存储在上述buyers标头中。

在此之后,.enrich()您需要编写自定义.transform()代码并遍历该buyers标头并执行String.replaceFirst("(\" + buyer.getKey() + \",)", "$1" + buyer.getValue()).

如果您的 JSON 已经是List<POJO>or List<Map>,您可以使用类似的方法,但使用 Java 8 Streams:

.<List<Map<?, ?>>>requestPayload(m ->
            m.getPayload()
                    .stream()
                    .map(entry -> entry.get("buyerId"))
                    .collect(Collectors.toList()))

来自数据库的结果可能是这样的Map<String, Map<?, ?>>,您可以执行类似的迭代来扩展与买家的订单地图。

于 2018-03-22T14:51:06.243 回答