下面是一个示例DTO
@Getter
@Setter
public class TestDto {
private Long id;
private String name;
private String sex;
}
假设我将这个对象存储在服务器上:{"id":1, "name": "alex", "sex": "M"}
如何发送一个只更新"名称"的请求?物体的一部分?
也许我可以发送这个:{"id":1, "name":"adam"}
使得对象变成如下:{"id":1, "name": "adam", "sex": "M"}
我还需要能够将字段设置为null(即清除字段的内容)。
在这种情况下,我想发送{"id":1, "name":"adam", "sex":null}
将存储的DTO更改为{"id":1, "name": "adam", "sex":null}
我如何使用java, spring boot等来做到这一点?
我知道如何使用:
@PutMapping
public TestDto update(Map<String, Object>map){ ... }
,但我也需要一些验证,如果我通过{"id":"1AA" ... }
我得到一个序列化异常。
p。找到这个魔法的第一步->1.在路径TestDto抛出Rest之前-需要像这样清除类型
Object body = testDto;
if将帮助你得到一个对象的字段,你想在服务器上,然后你将能够检测字段列表更新
不尝试检测缺席值和空值,考虑定义一个update对象,其中包含要更新的字段列表。
这样的对象可能像这样:
@Getter
@Setter
public class UpdateObject
{
private long id; // ID of the object to be updated.
private TestDto updates; // an object that contains the new values for the fields.
private List<String> updateFields; // a list of fields to be updated.
}
这里是一些Json
{
"id": 1,
"updates":
{
"name": "blem",
"sex": null
},
"updateFields": ["name", "sex"]
}
如果我理解对了,你只是用不同的字段向服务器发送请求。使用@ModelAttribute
注释,您可以以json格式发送您的正文。如果你只发送一个/两个字段或者你想要的{"id":1, "name":"adam"}
,由于spring数据jpa,你可以在数据库中更新你的模型。(在这种情况下,你的字段sex
将是空的,你需要创建一些操作来检查它的Mapstruct -转换你的dto在其他模型加上检查空/非空字段)。如果您想保存非M和非FM值,最好为sex
字段创建默认值。这是一个坏习惯,将来会成为你的坏笑话。
@Getter
公共Enum性别{私人男,私人女,私人违约}
好了,伙计们终于知道该怎么做了
1。客户端->将testDto路径为Object,而不是testDto .class
Object payLoad = testDto;
template.postForObject("url", payload);
2。服务器端->
@RestController
@RequestMapping("/test")
public class TestController {
private final Map<Long, TestDto> cash = new HashMap<>();
private final ObjectMapper mapper = new ObjectMapper();
@PostMapping
public TestDto create(@RequestBody TestDto dto) {
return cash.computeIfAbsent(dto.getId(), v -> dto);
}
@PutMapping("/{id}")
public TestDto update(@PathVariable Long id, @RequestBody String json) throws JsonProcessingException {
val oldValue = cash.get(id);
mapper.readerForUpdating(oldValue).readValue(json);
return cash.put(oldValue.getId(), oldValue);
}
}
这个提示让您只更新客户端真正更改的字段