Java POJO 属性映射

2022-09-03 15:46:02

我有一个用例,我在请求中收到一些属性,如下所示,

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

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

现在,我必须支持一个属性名称完全不同的旧版应用程序。例如:fName 成为 firstNamelName 成为 lastName

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

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

如何有效地实现这一点?我正在考虑使用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


推荐