java - Spring 数据休息 : Limit sending values on Update method

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

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

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

最佳答案

更新前,从数据库加载对象,使用jpa方法findById返回对象调用target。 然后从object-want-to-update复制所有非null/empty字段到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);
}

关于java - Spring 数据休息 : Limit sending values on Update method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54578753/

相关文章:

java - 在一个数组索引中存储多个对象或实例

java - 从 Junit4 迁移到 Junit5 : 时没有可运行方法错误

java - 如何在Spring boot中修改Mono对象的属性而不阻塞它

java - 引导 PropertySource 排序

java - 我如何使用java确定浏览器中打开了哪些网站?

java - 如何检查均匀分布的元素的最大数量?

Java 从 Servlet 读取未解码的 URL

java - 如何从 Hibernate session 中删除不需要的实体?

spring - 以 spring-boot 代码中的多态性为条件进行重构

java - Web应用MongoDB数据库结构