春季启动补丁

Posted

技术标签:

【中文标题】春季启动补丁【英文标题】:Spring boot PATCH 【发布时间】:2017-11-19 01:40:19 【问题描述】:

当我阅读文档时 (https://spring.io/guides/gs/accessing-data-rest/)

PUT 替换整个记录。未提供的字段将被替换 与空。 PATCH 可用于更新项目的子集。

所以,我尝试为我的用户实体使用 PATCH,其中包含 2 个字段(姓名和姓氏)

@RequestMapping(path="/user/id", method = RequestMethod.PATCH)
public User updateUser ( User user)        
    return userRepository.save(user);

当我发送到:

localhost:8080/user/34

带有name: "user" and surname: "testSurname" 的主体效果很好。 但是当我只发送name (without surname) 时,surname 也会更新为 null

如何防止 Spring Boot 更新具有空值的字段?

【问题讨论】:

userRepository.save(department) department 是什么?你是说userRepository.save(user) 吗? 您链接到的指南是关于为您提供 RESTful 端点的 Spring Data REST。在您的问题中,您已经编写了自己的端点,由您决定PATCH 的行为方式 我整理了一个 post,描述了在 Spring 中使用 PATCH 的方法。 GitHub 上提供了一个工作示例。 【参考方案1】:

您在这里没有使用 Spring Data Rest。您正在使用 spring 数据 jpa 存储库userRepository.save(department);

通过创建您的自定义 http 端点和 Spring MVC。

@RequestMapping(path="/user/id", method = RequestMethod.PATCH)
public User updateUser ( User user) ...

要查看您描述的补丁行为,您必须使用 spring data rest 公开的端点,而不是您制作的自定义端点。 当您创建自定义端点时,它将完全按照您编写的代码执行,spring 不会弄乱您的代码并改变行为。

【讨论】:

我找不到任何有用的信息。可以举个例子吗? @Sever 你可以在项目的官方页面上找到很多信息 - projects.spring.io/spring-data-rest 和 projects.spring.io/spring-data-jpa 你可能想检查项目的概念(他们应该做什么)。您已经找到的指南也是很好的资源。 嗨,是否可以有一个自定义的 http 端点,但仍然有 spring 使用来自 HTTP 请求的新值更新实体?所以我可以在客户方法中手动处理现在更新的实体? @user2049132 抱歉我没看懂问题 @EvgeniDimitrov 我想使用自定义 http 端点,但是当我在方法中使用它时,让 spring 将更新的值从请求合并到实体。这个方法里面@RequestMapping(path="/user/id", method = RequestMethod.PATCH) public User updateUser ( User user)

以上是关于春季启动补丁的主要内容,如果未能解决你的问题,请参考以下文章

春季启动启动器graphql不工作

春季批处理启动器应用程序 - 无法启动

春季启动批处理到具有多个作业的春季云任务

春季启动罐NoSuchBeanDefinitionException

春季启动 DispatcherServlet

春季启动 JSON 响应