Java 弹簧休息帽
我试图遵循最佳实践,想象一个带有/books端点的基本API 我上过以下课程: 书 BookRepository(分页和排序存储库,但未导出!!) BookController(这是服务类) BookResource(“代表性状态转移”中的书的“代表性”) 图书资源汇编程序 我的BookController如下所示:Java 弹簧休息帽,java,spring,rest,spring-hateoas,Java,Spring,Rest,Spring Hateoas,我试图遵循最佳实践,想象一个带有/books端点的基本API 我上过以下课程: 书 BookRepository(分页和排序存储库,但未导出!!) BookController(这是服务类) BookResource(“代表性状态转移”中的书的“代表性”) 图书资源汇编程序 我的BookController如下所示: @RequestMapping(path="/{id}", method = RequestMethod.GET) public ResponseEntity<?&g
@RequestMapping(path="/{id}", method = RequestMethod.GET)
public ResponseEntity<?> getBook(@PathVariable Long id) {
Book book = bookRepository.findOne(id);
BookResource bookResource = this.bookResourceAssembler.toResource(book);
return ResponseEntity.ok(bookResource);
}
public class BookResource extends ResourceSupport{
public String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
BookResourceAssembler:
@Component
public class BookResourceAssembler extends ResourceAssemblerSupport<Book, BookResource> {
public BookResourceAssembler() {
super(BookController.class, BookResource.class);
}
@Override
public BookResource toResource(Book entity) {
BookResource resource = createResourceWithId(entity.getDbid(), entity);
return resource;
}
}
我在哪里陈述?我应该添加哪些新类/函数来处理同一资源的v2
我找不到涵盖所有方面的好教程
我的第一个问题很容易解决,我想,题目不是
初始化,所以当我调用/books/1时,我得到title:null
您使用BookResource的方式不对。
我假设您的域对象(书)看起来像:
public class Book {
public String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
BookResource是一个包装器,它向域对象添加链接,并以RESTful方式呈现它
public class BookResource extends Resource<Book> {
public BookResource(Book content, Link... links) {
super(content, links);
}
}
在这种非常简单的情况下(对Book实例没有特殊处理),您甚至不需要这个端点,因为Spring为您生成了它
第二个也是更重要的问题是我如何进行内容协商
以及版本控制,这是RESTfulAPI的一个非常重要的方面。怎么
我应该介绍BookResourceV2吗?我应该在哪里协商
您需要定义一个RepositoryRestController
,并使用RequestMapping
注释的控制器端点的products
参数,类似于我在本文中所解释的
public class BookResource extends Resource<Book> {
public BookResource(Book content, Link... links) {
super(content, links);
}
}
@RequestMapping(path="/{id}", method = RequestMethod.GET)
public ResponseEntity getBook(@PathVariable Long id,
PersistentEntityResourceAssembler assembler) {
Book book = bookRepository.findOne(id);
if (null == book) {
throw new ResourceNotFoundException();
}
return ResponseEntity.ok(assembler.toResource(book));
}