3 回答
TA贡献1712条经验 获得超3个赞
你需要做这样的事情。请记住,这种方法有助于部分对象更新。这意味着如果您的对象(在 RequestBody 中)不包含某些字段(field==null),那么该字段将保持不变。
@PutMapping("user/{id}")
public boolean updateUser(@PathVariable id, @RequestBody User user) {
User currentUser = userRepo.findOne(id);
user = (User) PersistenceUtils.partialUpdate(currentUser, user);
return userRepo.save(user);
}
public class PersistenceUtils {
public static Object partialUpdate(Object dbObject, Object partialUpdateObject){
String[] ignoredProperties = getNullPropertyNames(partialUpdateObject);
BeanUtils.copyProperties(partialUpdateObject, dbObject, ignoredProperties);
return dbObject;
}
private static String[] getNullPropertyNames(Object object) {
final BeanWrapper wrappedSource = new BeanWrapperImpl(object);
return Stream.of(wrappedSource.getPropertyDescriptors())
.map(FeatureDescriptor::getName)
.filter(propertyName -> wrappedSource.getPropertyValue(propertyName) == null)
.toArray(String[]::new);
}
}
TA贡献1777条经验 获得超3个赞
你可以参考这个关于 PATCH vs PUT 的问题。
假设您只是在更改用户的在线状态。在这种情况下,最好使用 PATCH 并将更改反映在路径变量上。
例如:
@PatchMapping("user/{id}/{status}")
public boolean setStatus(@PathVariable id, @PathVariable status) {
User currentUser = userRepo.findOne(id);
currentUser.setStatus(status);
userRepo.save(currentUser);
// ...
}
如果打算对未定义数量的字段进行更改,您可以使用 PUT,在请求正文中包含数据并使用 DTO 模式。你可以在网上找到很多关于 DTO 模式的例子。在这种情况下,代码如下。
@PatchMapping("user/{id}")
public boolean updateUser(@PathVariable id, @RequestBody UserDTO userDTO) {
// UserMapper is the mapper class which returns you a new User
// populated with the data provided in the data transfer object.
User user = UserMapper.makeUser(userDTO);
userRepo.update(id, user);
// ...
}
添加回答
举报