在将应用程序迁移到Spring Boot之后使用Spring Data Rest时,我发现使用@Id的实体属性不再编组为JSON

Pat*_*ard 19 java spring json spring-data-rest spring-boot

这个问题与这个问题有关(Spring boot @ResponseBody没有序列化实体id).我观察到,在将应用程序迁移到Spring Boot并使用spring-boot-starter-data-rest依赖项后,我的实体@Id字段不再在生成的JSON中进行编组.

这是我的请求映射,在调试时,我可以看到数据在返回之前没有被更改,因此@Id属性稍后被剥离.

@RequestMapping(method = RequestMethod.GET, produces = {"application/json"})
public PagedResources<Receipt> receipts(Pageable pageable, PagedResourcesAssembler assembler) {
    Page<Receipt> receipts = receiptRepository.findByStorerAndCreatedDateGreaterThanEqual("003845", createdStartDate, pageable);
    PagedResources<Receipt> pagedResources = assembler.toResource(receipts, receiptResourceAssembler);
    return pagedResources;
}
Run Code Online (Sandbox Code Playgroud)

是否有一个设置允许我在生成的JSON中保留@Id字段,因为我的应用程序允许用户按该值进行搜索.

谢谢 :)

Sta*_*007 24

默认情况下,Spring Data Rest不会吐出ID.但是,您可以通过exposeIdsFor(..)方法选择性地启用它.您可以在配置中执行此操作,类似这样

@Configuration
public static class RepositoryConfig extends
        RepositoryRestMvcConfiguration {

    @Override
    protected void configureRepositoryRestConfiguration(
            RepositoryRestConfiguration config) {
        config.exposeIdsFor(Class1.class, Class2.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 从版本2.4开始,`configureRepositoryRestConfiguration`方法应该通过扩展`RepositoryRestConfigurerAdapter`类来覆盖. (8认同)
  • 应该注意的是,如果使用spring-boot,则需要扩展`SpringBootRepositoryRestMvcConfiguration`而不是`RepositoryRestMvcConfiguration`并使其成为普通类而不是静态类. (4认同)
  • 是否存在SpringBoot 1.3.*任何允许默认公开所有id的设置?或者我是否必须在RepositoryConfig类中手动列出它们?; / (4认同)
  • 并且不要忘记现在支持实体类中的id字段的getter和setter!(我忘了它并且正在寻找那么多的时间) (2认同)

小智 20

从Spring Data Rest 2.4(如果使用spring-boot 1.3.0.M5这是一个传递依赖)开始,您可以使用RepositoryRestConfigurerAdapter.例如,

@Configuration
class SpringDataRestConfig {

    @Bean
    public RepositoryRestConfigurer repositoryRestConfigurer() {

        return new RepositoryRestConfigurerAdapter() {
            @Override
            public void configureRepositoryRestConfiguration(
                                 RepositoryRestConfiguration config) {
                config.exposeIdsFor(Class1.class, Class2.class);
            }
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

  • 对于最近的 spring 版本,这是正确的答案(除了缺少的分号)。 (2认同)

GKi*_*lin 9

在揭露之前Id请阅读讨论:https://github.com/spring-projects/spring-hateoas/issues/66

在REST中,资源的id是它的URI.客户端没有明确使用id来构建url.例如,您可以替换uuid的id.甚至改变网址方案.