我已经使用Spring-Data-Rest通过项目实现了。我正在尝试对表中的现有记录进行更新。但是,当我尝试通过请求仅发送几个字段而不是所有字段(出现在Entity类中)时,Spring-Data-Rest认为我正在发送null / empty值。最终,当我查看数据库时,我没有通过请求发送的字段被空/空值覆盖。因此,我的理解是,即使我没有发送这些值,spring数据其余部分也会在Entity类中看到它们,并将这些值发送为null / empty。我的问题是,有没有办法在我不通过请求发送的UPDATE时禁用字段。感谢您的帮助。
更新:我正在使用PUT方法。阅读评论后,我将其更改为PATCH,并且现在可以正常使用。感谢所有帮助
答案 0 :(得分:2)
在更新之前,使用jpa方法findById
从数据库加载对象,返回对象调用target
。
然后将所有非空/空的字段从object-want-to-update
复制到target
,最后保存target
对象。
这是代码示例:
public void update(Object objectWantToUpdate) {
Object target = repository.findById(objectWantToUpdate.getId());
copyNonNullProperties(objectWantToUpdate, target);
repository.save(target);
}
public void copyNonNullProperties(Object source, Object target) {
BeanUtils.copyProperties(source, target, getNullPropertyNames(source));
}
public String[] getNullPropertyNames (Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
PropertyDescriptor[] propDesList = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<String>();
for(PropertyDescriptor propDesc : propDesList) {
Object srcValue = src.getPropertyValue(propDesc.getName());
if (srcValue == null) {
emptyNames.add(propDesc.getName());
}
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}
答案 1 :(得分:0)
您可以编写仅更新特定字段的自定义更新查询:
@Override
public void saveManager(Manager manager) {
Query query = sessionFactory.getCurrentSession().createQuery("update Manager set username = :username, password = :password where id = :id");
query.setParameter("username", manager.getUsername());
query.setParameter("password", manager.getPassword());
query.setParameter("id", manager.getId());
query.executeUpdate();
}
答案 2 :(得分:0)
正如一些评论指出的那样,使用PATCH而不是PUT解决了该问题。欣赏所有输入。以下来自Spring Data Rest文档:
“ PUT方法将目标资源的状态替换为所提供的请求正文。
PATCH方法类似于PUT方法,但是部分更新了资源状态。”
此外,我喜欢@Tran Quoc Vu答案,但由于我不必使用自定义控制器,因此暂时不执行它。如果在更新实体时涉及某些逻辑(例如:验证),则我赞成使用自定义控制器。