Java POJO属性映射

15

我有一个使用场景,其中请求中会收到一些属性,例如:

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

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

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

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

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

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


当我在两个系统之间同步信息时,遇到了类似的问题。它们有非常不同的命名约定,其中一个在过去几年中多次更改了命名约定(我必须同步所有内容)。我解决这个问题的方法是使用一个配置文件,将新字段映射到旧字段。当收到同步请求时,我找到匹配的字段,将其切换到与之配对的字段,并发送它。对于响应,我再次使用备用名称获取映射并发送响应。也许类似的方法可以帮助你解决问题? - gkgkgkgk
当然。我对此没有太多的研究,但我发现这是最好的解决方案,因为如果分发应用的人需要添加/删除字段,它可以被更改。我采取的另一种方法(因为它过于硬编码而被废弃)是编写自定义对象序列化程序/反序列化程序,并通过它运行请求回复。 - gkgkgkgk
@gkgkgkgk 好的,你有关于配置解决方案的任何要点或提示吗? - User0911
3
你为什么不编写一个将请求JSON转换成你所规范化的JSON格式的转换器? - Mạnh Quyết Nguyễn
3
我更倾向于跳过对象映射,直接将JSON映射到规范化的JSON...最终这就是你想要的...你不需要发明对你没有任何好处的类/对象,并使用映射工具来完成你已经可以通过普通的json转换实现的事情...也许下面的答案对你有帮助:JSON转JSON转换器,还涉及ElasticSearch作为用例 - Roland
显示剩余2条评论
3个回答

4

您有什么阻止您编写请求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。

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

0

使用JSON到JSON转换器。关于此的好答案可以在这里找到:JSON到JSON转换器和这里:JSON的XSLT等效项

最终,您在这里不需要中间对象类型。您甚至说过,您还没有这样的类型,并且发明它只是为了进行转换并没有什么意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接