Java 在将应用程序迁移到SpringBoot后使用SpringDataREST时,我注意到带有@Id的实体属性不再编组为JSON

Java 在将应用程序迁移到SpringBoot后使用SpringDataREST时,我注意到带有@Id的实体属性不再编组为JSON,java,json,spring,spring-boot,spring-data-rest,Java,Json,Spring,Spring Boot,Spring Data Rest,此问题与此SO问题()相关。我观察到,在将应用程序迁移到Spring Boot并使用Spring Boot starter数据rest依赖项之后,我的entity@Id字段不再在生成的JSON中编组 这是我的请求映射,在调试时,我可以看到数据在返回之前没有被更改,因此@Id属性稍后会被剥离 @RequestMapping(method = RequestMethod.GET, produces = {"application/json"}) public PagedResources<Re

此问题与此SO问题()相关。我观察到,在将应用程序迁移到Spring Boot并使用Spring Boot starter数据rest依赖项之后,我的entity@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;
}
@RequestMapping(method=RequestMethod.GET,products={“application/json”})
公共PagedResources收据(Pageable Pageable,PagedResourcesAssembler汇编程序){
PageReceipts=receiptRepository.FindBystoreandCreatedDateCreateTaneQual(“003845”,createdStartDate,可分页);
PagedResources PagedResources=assembler.toResource(收据,收据资源汇编程序);
返回页面资源;
}
是否存在允许我在生成的JSON中保留@Id字段的设置,因为我的应用程序允许用户按该值搜索


谢谢:)

默认情况下,Spring数据Rest不会吐出ID。但是,您可以通过方法有选择地启用它。您可以在配置中这样做

@Configuration
public static class RepositoryConfig extends
        RepositoryRestMvcConfiguration {

    @Override
    protected void configureRepositoryRestConfiguration(
            RepositoryRestConfiguration config) {
        config.exposeIdsFor(Class1.class, Class2.class);
    }
}

从SpringDataREST2.4开始(如果使用SpringBoot1.3.0.M5,这是一个可传递的依赖项),您可以使用。比如说,

@Configuration
class SpringDataRestConfig {

    @Bean
    public RepositoryRestConfigurer repositoryRestConfigurer() {

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

    }

}

在公开Id之前,请阅读以下内容:

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


@Id annotation在您的模型类中发挥神奇的作用

public class Location {

    @Id
    private String woeid;
    private String locationName;
然后,您的mongo对象将如下所示:

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

@getter、@setters和它将公开json结果,希望它能帮助您

应该注意的是,如果您使用spring boot,您需要扩展
SpringBootRepositoryRestMvcConfiguration
而不是
RepositoryRestMvcConfiguration
,并使其成为一个普通类而不是静态类,
configureRepositoryRestConfiguration
方法应该通过扩展
repositoryrestconfiguureradapter
类来覆盖。不要忘记现在为实体类中的id字段支持getter和setter!。。(我忘了,搜索了很多时间)SpringBoot 1.3中有没有允许在默认情况下一次公开所有id的设置?或者我必须在RepositoryConfig类中手动列出它们吗/对于最新的spring版本,这是正确的答案(除了缺少的分号)。请查看是否需要公开所有实体的标识符,或者只公开那些扩展或实现特定超类或接口的实体的标识符。