是否有可能JSON在Spring Data REST中修补Map元素?

时间:2018-04-20 11:34:18

标签: spring-data-rest

我有一个包含设置列表的用户实体。最初我使用List但使用Map返回一个更容易搜索的JSON。

列出版本:

实体中的数据库列声明:

private List<Setting> settings = new ArrayList<>();

在GET上呈现JSON:

"settings": [
    {"name1" : "setting 1", "value" : 5},
    {"name2" : "setting 2", "value" : 6},
]

JSON贴片:

[{"op":"replace","path":"/settings/0/value", "value": "6"}]

地图版本:

实体中的数据库列声明:

@MapKey(name = "name")
private Map<String, Setting> settings = new HashMap<>();

在GET上呈现JSON:

"settings": {
    "name1": {"name1" : "setting 1", "value" : 5},
    "name2": {"name2" : "setting 2", "value" : 6},
}

如何打补丁?试过这个,但它不起作用。杰克逊想在我的POJO中找到一个名为name1的房产。

[{"op":"replace","path":"/settings/name1/value", "value": "6"}]

1 个答案:

答案 0 :(得分:1)

由于您希望将settings字段设为Map,因此您可以通过以下方式实现该字段:

@ElementCollection(fetch = FetchType.EAGER)
@MapKeyColumn(name = "settings_name")
@Column(name = "settings_value")
@CollectionTable(name = "entity_settings", joinColumns = @JoinColumn(name = "entity"))
private final Map<String, String> settings = new HashMap<>();

现在要添加或替换设置,您需要做的就是在实体端点PATCH /entity/id上使用请求正文中的JSON对象进行PATCH调用:

Content-Type: application/json
PATCH /entity/id
{
  "settings": {
     "name1": "5"
  }
}

以上请求会创建一个新设置,其中包含密钥name和值5,如果它尚未存在,则替换该值。

我认为Setting不必是一个实体,并且可以由包含实体完全拥有。除非您希望Setting可以单独访问,但正如您在评论中所说的那样,它没有自己的存储库,我认为情况并非如此。