Java POJO属性映射

Use*_*911 15 java orika objectmapper

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

"filters": [
  {
    "field": "fName",
    "value": "Tom"
  },
  {
    "field": "LName",
    "value": "Hanks"
  }
]
Run Code Online (Sandbox Code Playgroud)

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

现在,我必须支持遗产应用程序,其中属性的名称完全不同.例如:fName变为firstName,lName变为lastName.

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

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

如何有效实现这一目标?我正在考虑使用Orika mapper,但不确定如果不首先定义类,它将如何工作.

Mạn*_*yễn 4

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

我能想到的正常流程是:

Request JSON -> POJO -> POJO with normalized value -> Normalized JSON
Run Code Online (Sandbox Code Playgroud)

所以你的 POJO 看起来像:

public class Filter {

     List<FieldFilter> filters;

     public static class FieldFilter {
         private String field;
         private String value;
     }
}
Run Code Online (Sandbox Code Playgroud)

现在您将拥有一个如下所示的转换图:

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
Run Code Online (Sandbox Code Playgroud)

然后你改造你的 POJO:

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

然后将 Filter 类转换为标准化 JSON。