【问题标题】: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 上提供了一个工作示例。

标签: spring spring-boot spring-rest


【解决方案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-restprojects.spring.io/spring-data-jpa 你可能想检查项目的概念(他们应该做什么)。您已经找到的指南也是很好的资源。
  • 嗨,是否可以有一个自定义的 http 端点,但仍然有 spring 使用来自 HTTP 请求的新值更新实体?所以我可以在客户方法中手动处理现在更新的实体?
  • @user2049132 抱歉我没看懂问题
  • @EvgeniDimitrov 我想使用自定义 http 端点,但是当我在方法中使用它时,让 spring 将更新的值从请求合并到实体。这个方法里面@RequestMapping(path="/user/{id}", method = RequestMethod.PATCH) public User updateUser ( User user) {
猜你喜欢
  • 2017-09-11
  • 2015-04-18
  • 2017-06-24
  • 2015-08-22
  • 2015-09-18
  • 2015-03-20
  • 2018-01-24
  • 2016-08-22
  • 2016-07-22
相关资源
最近更新 更多