【问题标题】:How to configure Spring Data REST to return the representation of the resource created for a POST request?如何配置 Spring Data REST 以返回为 POST 请求创建的资源的表示?
【发布时间】:2014-11-04 16:34:42
【问题描述】:

我正在关注 spring-data-rest 指南Accessing JPA Data with REST。当我 http 发布一条新记录时,它会被插入(响应是 201)。太好了,但是有没有办法配置 REST MVC 代码以返回新创建的对象?我宁愿不必发送搜索请求来查找新实例。

【问题讨论】:

    标签: spring rest spring-data-jpa


    【解决方案1】:

    如果您使用的是 Spring Boot,则可以将以下行添加到您的 application.properties 文件中,分别用于 POST(创建)和 PUT(更新)

    spring.data.rest.return-body-on-create=true
    spring.data.rest.return-body-on-update=true
    

    【讨论】:

      【解决方案2】:

      这是另一个使用 DI 而不是扩展 RepositoryRestMvcConfiguration 或使用 ConfigurableApplicationContext 的变体。

      @SpringBootApplication
      @EnableConfigurationProperties
      @Configuration
      @ComponentScan
      public class Application {
      
          public static void main(String[] args) {
              SpringApplication.run(Application.class, args);    
          }
      
          @Autowired private RepositoryRestConfiguration repositoryRestConfiguration;
      
          @PostConstruct
          public void exposeIds() {
              this.repositoryRestConfiguration.setReturnBodyForPutAndPost(true);
          }
      }
      

      【讨论】:

      • 这个替代方案比安德烈的解决方案更好,还是真的只是一个替代方案?我的意思是,使用它们有什么好处吗?
      【解决方案3】:

      您不必搜索创建的实体。正如 HTTP 规范所建议的那样,POST 请求返回状态代码 201 Created 应该包含一个 Location 标头,其中包含刚刚创建的资源的 URI。

      因此,您需要做的就是有效地向该特定 URI 发出 GET 请求。 Spring Data REST 在RepositoryRestConfiguration.setReturnBodyOnCreate(…)….setReturnBodyOnUpdate(…) 上也有两个方法,您可以使用它们来配置框架以立即返回刚刚创建的资源的表示。

      【讨论】:

      • 基于这个问题,我实际上已经更新了所有 Spring Data REST 入门指南以包含此信息,因此您不必来这里发现该功能。
      • @gregturn 我认为这正是我一直在寻找的解决方案。
      • 太棒了!我记得读过它,但是当我开始测试时,我忘记了在哪里看。
      • 应该在哪里调用 RepositoryRestConfiguration.setReturnBodyOnCreate(true)?
      【解决方案4】:

      Spring Boot 示例:

      @Configuration
      @EnableMongoRepositories
      @Import(RepositoryRestMvcConfiguration.class)
      @EnableAutoConfiguration
      public class Application {
      
          public static void main(String[] args) {
      
              ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args);
      
              RepositoryRestConfiguration restConfiguration = ctx.getBean(RepositoryRestConfiguration.class);
      
              restConfiguration.setReturnBodyOnCreate(true);
          }
      }
      

      @Configuration
      @EnableMongoRepositories
      @EnableAutoConfiguration
      public class Application extends RepositoryRestMvcConfiguration {
      
          public static void main(String[] args) {
      
              SpringApplication.run(Application.class, args);
          }
      
          @Override
          protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
              super.configureRepositoryRestConfiguration(config);
              config.setReturnBodyOnCreate(true);
          }
      }
      

      祝你好运!

      【讨论】:

      • configureRepositoryRestConfiguration deprecated...从 2.4 开始,直接实现 RepositoryRestConfigurer.configureRepositoryRestConfiguration(RepositoryRestConfiguration) 或扩展 RepositoryRestConfigurerAdapter 并覆盖该方法。
      猜你喜欢
      • 2015-08-30
      • 2015-11-10
      • 1970-01-01
      • 2014-11-10
      • 2017-03-10
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多