我有同樣的問題,正如Deinum先生所指出的,答案是否定的,您不能使用save。 主要問題是Spring Data不知道如何處理null。 是否設置了空值,還是因為需要將其刪除而設置了空值?
現在從您的問題來看,我認為您也有同樣的想法,那就是保存將使我避免手動設置所有更改的值。
那么有可能避免所有的手動映射嗎? 好吧,如果您選擇遵循空值始終表示“未設置”的約定,并且您擁有原始的模型ID,則可以。您可以使用Springs BeanUtils來避免自己進行任何映射。
您可以執行以下操作:
讀取現有對象
使用BeanUtils復制值
保存對象
現在,Spring的BeanUtils實際不支持不復制空值,因此它將覆蓋現有模型對象上未設置空值的任何值。 幸運的是,這里有一個解決方案:
如何使用springframework BeanUtils copyProperties忽略空值?
因此,將所有這些放在一起,最終會得到這樣的結果
@RequestMapping(value = "/rest/user", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity> updateUser(@RequestBody User user) {
User existing = userRepository.read(user.getId());
copyNonNullProperties(user, existing);
userRepository.save(existing);
// ...
}
public static void copyNonNullProperties(Object src, Object target) {
BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
}
public static String[] getNullPropertyNames (Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set emptyNames = new HashSet();
for(java.beans.PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null) emptyNames.add(pd.getName());
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}