Spring Data Rest:限制在Update方法上发送值

时间:2019-02-07 17:12:10

标签: java spring spring-boot spring-data-jpa spring-data-rest

我已经使用Spring-Data-Rest通过项目实现了。我正在尝试对表中的现有记录进行更新。但是,当我尝试通过请求仅发送几个字段而不是所有字段(出现在Entity类中)时,Spring-Data-Rest认为我正在发送null / empty值。最终,当我查看数据库时,我没有通过请求发送的字段被空/空值覆盖。因此,我的理解是,即使我没有发送这些值,spring数据其余部分也会在Entity类中看到它们,并将这些值发送为null / empty。我的问题是,有没有办法在我不通过请求发送的UPDATE时禁用字段。感谢您的帮助。

更新:我正在使用PUT方法。阅读评论后,我将其更改为PATCH,并且现在可以正常使用。感谢所有帮助

3 个答案:

答案 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方法,但是部分更新了资源状态。”

https://docs.spring.io/spring-data/rest/docs/current/reference/html/#customizing-sdr.hiding-repository-crud-methods

此外,我喜欢@Tran Quoc Vu答案,但由于我不必使用自定义控制器,因此暂时不执行它。如果在更新实体时涉及某些逻辑(例如:验证),则我赞成使用自定义控制器。