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

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

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

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

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

谢谢 :)

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

 @Configuration public static class RepositoryConfig extends RepositoryRestMvcConfiguration { @Override protected void configureRepositoryRestConfiguration( RepositoryRestConfiguration config) { config.exposeIdsFor(Class1.class, Class2.class); } } 

从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); } } } } 

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

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

模型类中的@Id注释具有魔力。

 public class Location { @Id private String woeid; private String locationName; 

然后你的mongo对象将如下所示:

 { "_id" : "2487889", "_class" : "com.agilisys.weatherdashboard.Location", "locationName" : "San Diego, CA" } 

把@getter,@ setter放到json结果中,希望它能帮到你