我正在尝试基于以下内容实现Manager实体的部分更新:
实体
public class Manager {
private int id;
private String firstname;
private String lastname;
private String username;
private String password;
// getters and setters omitted
}
控制器中的SaveManager方法
@RequestMapping(value = "/save", method = RequestMethod.PATCH)
public @ResponseBody void saveManager(@RequestBody Manager manager){
managerService.saveManager(manager);
}
在Dao impl中保存对象管理器。
@Override
public void saveManager(Manager manager) {
sessionFactory.getCurrentSession().saveOrUpdate(manager);
}
当我保存对象时,用户名和密码已正确更改,但其他值为空。
所以我需要做的是更新用户名和密码,并保留所有剩余的数据。
发布于 2017-07-20 04:42:43
如果你真的在使用补丁,那么你应该使用RequestMethod.PATCH,而不是RequestMethod.POST。
补丁程序映射应包含可用于检索要打补丁的Manager对象的id。此外,它应该只包括您想要更改的字段。在您的示例中,您发送的是整个实体,因此您无法辨别实际正在更改的字段( empty是指不使用此字段,还是实际上将其值更改为空)。
也许这样的实现就是您想要的?
@RequestMapping(value = "/manager/{id}", method = RequestMethod.PATCH)
public @ResponseBody void saveManager(@PathVariable Long id, @RequestBody Map<Object, Object> fields) {
Manager manager = someServiceToLoadManager(id);
// Map key is field name, v is value
fields.forEach((k, v) -> {
// use reflection to get field k on manager and set it to value v
Field field = ReflectionUtils.findField(Manager.class, k);
field.setAccessible(true);
ReflectionUtils.setField(field, manager, v);
});
managerService.saveManager(manager);
}
https://stackoverflow.com/questions/45200142
复制相似问题