以通用方式从对象中选取属性

问题描述 投票:2回答:1

我想构建一个数据聚合器,该数据聚合器调用多个服务,并从它们的响应中提取一些属性,然后构建聚合的对象。

请考虑以下示例:要获取订单详细信息,我需要调用OrderService的GetOrderDetails API,该API返回以下输出(简化的输出):

{
   statusCode: OK,
   orderDetails: {
      orderId: "order_id",
      offer: {
         offerId: "offer_id",
         offerType: "offer_type"
      },
      address: {
         addressId: "address_id",
         houseNo: "house_no",
         city: "city",
         state: "state"
      }
   }
}

类似地,我需要打电话给其他服务。

问题我需要通过从相关服务的获取程序中从这些服务的响应中挑选属性来构建输出对象,而无需对逻辑进行硬编码。我计划将所需属性及其相应路径的列表存储为config,然后提取逻辑将是通用的。

嗯,配置看起来像:

输出属性:dotted_hierarchy_path

orderId:orderDetails.orderIdaddressId:orderDetails.address.addressId所以,我的输出对象将是:

{ orderId: <order_id>, addressId: <address_id> }

如果我有这种配置,我的Java代码将是通用的,即它可以从任何对象中挑选任何属性。

要提取所需的属性,我想是遍历点线路径并通过Java Reflection获得值。但是Java反射很慢。

这是一个实际的世界问题,因此希望人们提出宝贵的意见。

我想构建一个数据聚合器,它调用多个服务并从它们的响应中提取一些属性,然后构建聚合的对象。请考虑以下示例:要获取订单...
java aggregation soa
1个回答
0
投票
正如您所说,反思是缓慢而棘手的。我不会尝试从头开始重新实现它,而是使用现有的库,例如FasterXML/jackson。而且我现在不担心性能。

通常,我会尝试将对象转换为嵌套地图。如果您可以访问普通的json,则无需将它们映射到对象,这样就可以跳过反射:

© www.soinside.com 2019 - 2024. All rights reserved.