从Spring Data REST返回JSON响应中的ID

lap*_*ots 9 spring-data-rest spring-boot

我有一个实体

@Entity
@Table(name = "books")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;

    @Column(name = "id", unique = true, nullable = false)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

我像这样初始化它

@PostConstruct
public void init() {
    List<String> newFiles = this.listFiles();
    newFiles.forEach(filename -> {
        Book book = new Book();
        book.setName(filename);

        dbRepository.save(book);
    });
}
Run Code Online (Sandbox Code Playgroud)

如果我将结果设置为save实例Book,我可以得到它id并且它不是null-so id被创建好了.

我定义了一个存储库

@RepositoryRestResource
public interface IBooksRepository extends CrudRepository<Book, Long> {
}
Run Code Online (Sandbox Code Playgroud)

我想用它来获取并将数据设置到books数据库中的表中.

当我尝试访问我的repository rest使用时curl localhost:8080/books,我得到了这个回复

{
   "_embedded":{
      "books":[
         {
            "name":"simple-file.txt",
            "_links":{
               "self":{
                  "href":"http://localhost:8080/books/1"
               },
               "book":{
                  "href":"http://localhost:8080/books/1"
               }
            }
         }
      ]
   },
   "_links":{
      "self":{
         "href":"http://localhost:8080/books"
      },
      "profile":{
         "href":"http://localhost:8080/profile/books"
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

books元素返回name唯一的.我怎样才能让它回归id,与...相同name

Ral*_*ert 12

Spring Data Rest 默认隐藏 ID,为了让它在JSON中你必须为你的实体手动配置它.根据您的弹簧版本,您可以提供自己的配置(旧):

@Configuration
public class ExposeEntityIdRestConfiguration extends RepositoryRestMvcConfiguration {

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

...或注册RepositoryRestConfigurer(当前):

@Component
public class ExposeEntityIdRestMvcConfiguration extends RepositoryRestConfigurerAdapter {

  @Override
  public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
    config.exposeIdsFor(Book.class);
  }
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅Spring Data Rest文档.

  • `RepositoryRestConfigurerAdapter` 现在已弃用,您必须直接实现 `RepositoryRestConfigurer`。 (2认同)

Dom*_*ico 6

接受的答案会覆盖已弃用的方法。这是更新的版本:

@Component
public class RestConfig implements RepositoryRestConfigurer {

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) {
        config.exposeIdsFor(Book.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是RepositoryRestConfigurer在带@SpringBootApplication注释的类中实现:

@SpringBootApplication
public class MyApplication implements RepositoryRestConfigurer {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) {
        config.exposeIdsFor(Book.class);
    }

}
Run Code Online (Sandbox Code Playgroud)