我正在尝试遵循最佳实践,设想一个具有/books端点的基本应用程序接口。
我有以下类: Book BookRepository (PagingAndSortingRepository,但不能导出!)BookController (这是服务类) BookResource (书在"REpresentational状态转移“中的”表示“) BookResourceAssembler
我的BookController看起来像这样:
@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);
}我的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;
}
}我的第一个问题很容易解决,我猜,title没有初始化,所以当我调用/books/1时,我会得到title: null。
第二个也是更重要的问题是如何进行内容协商和版本控制,这是RESTful应用程序接口的一个非常重要的方面。我应该如何引入BookResourceV2 ?我应该在哪里协商它?比方说我想
"Content-Type: application/vnd.company.book+json.v2"我该从哪里说起呢?我应该添加哪些新的类/函数来处理同一资源的这个v2?
我找不到一个涵盖所有方面的好教程。
发布于 2017-04-06 22:56:56
我想我的第一个问题很容易解决,标题没有初始化,所以当我调用/
/1时,我得到的标题是:空。
您正在以错误的方式使用BookResource。我假设您的域对象(Book)如下所示:
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);
}
}根据记录,在这种情况下,您甚至不需要自定义的Resource和ResourceAssembler类:
@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));
}在这个非常简单的例子中(不需要对Book实例进行特殊处理),您甚至不需要这个端点,因为Spring会为您生成它。
第二个也是更重要的问题是如何进行内容协商和版本控制,这是RESTful
的一个非常重要的方面。我应该如何引入BookResourceV2 ?我应该在哪里协商它?
您需要定义一个RepositoryRestController并使用RequestMapping-annotated控制器端点的produces参数,这与我在此post中解释的内容类似。
https://stackoverflow.com/questions/43063297
复制相似问题