【问题标题】:Java POJO attributes mappingJava POJO 属性映射
【发布时间】:2019-01-09 13:43:28
【问题描述】:

我有一个用例,我在这样的请求中收到一些属性,

"filters": [
  {
    "field": "fName",
    "value": "Tom"
  },
  {
    "field": "LName",
    "value": "Hanks"
  }
]

我没有为此定义模型。我只是在请求中收到这些属性,并使用这些属性对弹性搜索进行查询。我在弹性搜索中的记录具有相同的属性名称。

现在,我必须支持属性名称完全不同的遗留应用程序。 例如:fName 变为 firstNamelName 变为 lastName

问题:需要在请求中接受旧的属性名称,将它们转换为新的,以便与我的弹性搜索记录匹配。在从应用程序发出响应之前,获取具有新属性名称的数据并转换回旧名称。

注意:我没有为这些记录定义 POJO。

如何有效地实现这一目标?我正在考虑使用 Orika 映射器,但不确定在不先定义类的情况下如何工作。

【问题讨论】:

  • 我在两个系统之间同步信息时遇到了类似的问题。它们有非常不同的命名约定,其中一个在过去几年中多次更改命名约定。 (我必须同步所有这些)。我解决这个问题的方法是使用配置文件,将新字段映射到旧字段。当同步请求进来时,我找到了匹配的字段,将其切换到与之配对的字段,然后将其发送出去。对于响应,我使用备用名称再次获取映射并发送响应。也许类似的东西可以提供帮助?
  • 当然。我对此并没有太多的研究,但我发现这是最好的解决方案,因为如果他们需要添加/删除字段,我分发应用程序的人可以更改它。我采用的另一种方法(由于编码太硬而放弃了)是编写自定义对象序列化器/反序列化器并通过它运行请求回复。
  • @gkgkgkgk 好的,您有任何可用于配置解决方案的要点或指针吗?
  • 是什么阻止您将转换器从请求 JSON 写入规范化 JSON?
  • 我也宁愿跳过对象映射并直接将 JSON 映射到规范化 JSON...最后这就是您想要的...您不需要发明没有的类/对象对您有利,另外使用映射实用程序来完成您已经可以通过普通 json 转换完成的工作......也许以下答案对您有帮助:JSON to JSON transformer mentioning also ElasticSearch as use case

标签: java objectmapper orika


【解决方案1】:

是什么阻止您编写从请求 JSON 到标准化 JSON 的转换器?

我能想到的正常流程是:

Request JSON -> POJO -> POJO with normalized value -> Normalized JSON

所以你的 POJO 看起来像:

public class Filter {

     List<FieldFilter> filters;

     public static class FieldFilter {
         private String field;
         private String value;
     }
}

现在您将拥有如下转换图:

Map<String, String> fieldNameMapping = new HashMap<>();
fieldNameMapping.put("fName", "firstName");
fieldNameMapping.put("firstName", "firstName");

// The process of populating this map can be done either by a static initializer, or config/properties reader

然后你转换你的 POJO:

Filter filterRequest;
List<FieldFilters> normlizedFilters = 
    filterReq.getFilters().stream()
             .map(f -> new FieldFilter(fieldNameMapping.get(f.getField()), f.getValue())
             .collect(toList());

然后将 Filter 类转换为规范化的 JSON。

【讨论】:

    【解决方案2】:

    我们有类似的场景,我们正在使用 apache JOLT。如果您想尝试一些示例,可以参考jolt-demo-online-utility

    【讨论】:

      【解决方案3】:

      改为使用 JSON 到 JSON 转换器。可以在此处找到有关此问题的好答案:JSON to JSON transformer 和此处:XSLT equivalent for JSON

      最后,您在这里不需要中间对象类型。你甚至说,你还没有这种类型,发明它只是为了改造它,没有任何意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-01
        • 2017-11-02
        • 1970-01-01
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多