是否可以 JSON 修补 Spring Data REST 中的 Map 元素?
Is it possible to JSON patch a Map element in Spring Data REST?
我有一个带有设置列表的用户实体。最初我使用 List 但使用 Map returns a 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},
}
如何打补丁?试过这个,但它不起作用。 Jackson 在我的 POJO 中想要一个名为 name1
的 属性。
[{"op":"replace","path":"/settings/name1/value", "value": "6"}]
由于您更喜欢将 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<>();
现在要添加或替换设置,您需要做的就是在请求正文中使用 JSON 对象对实体端点 PATCH /entity/id
进行 PATCH 调用:
Content-Type: application/json
PATCH /entity/id
{
"settings": {
"name1": "5"
}
}
以上请求将使用键 name
和值 5
创建一个新设置,如果它不存在则替换该值。
我认为 Setting
不必是一个实体,可以完全由包含的实体拥有。除非您希望 Setting
可以单独访问,但正如您在评论中所说,它没有自己的存储库,否则我认为情况并非如此。
我有一个带有设置列表的用户实体。最初我使用 List 但使用 Map returns a 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},
}
如何打补丁?试过这个,但它不起作用。 Jackson 在我的 POJO 中想要一个名为 name1
的 属性。
[{"op":"replace","path":"/settings/name1/value", "value": "6"}]
由于您更喜欢将 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<>();
现在要添加或替换设置,您需要做的就是在请求正文中使用 JSON 对象对实体端点 PATCH /entity/id
进行 PATCH 调用:
Content-Type: application/json
PATCH /entity/id
{
"settings": {
"name1": "5"
}
}
以上请求将使用键 name
和值 5
创建一个新设置,如果它不存在则替换该值。
我认为 Setting
不必是一个实体,可以完全由包含的实体拥有。除非您希望 Setting
可以单独访问,但正如您在评论中所说,它没有自己的存储库,否则我认为情况并非如此。