首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring REST HATEOAS

Spring REST HATEOAS
EN

Stack Overflow用户
提问于 2017-03-28 15:33:56
回答 1查看 147关注 0票数 0

我正在尝试遵循最佳实践,设想一个具有/books端点的基本应用程序接口。

我有以下类: Book BookRepository (PagingAndSortingRepository,但不能导出!)BookController (这是服务类) BookResource (书在"REpresentational状态转移“中的”表示“) BookResourceAssembler

我的BookController看起来像这样:

代码语言:javascript
复制
@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看起来像这样:

代码语言:javascript
复制
public class BookResource extends ResourceSupport{
    public String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

}

BookResourceAssembler:

代码语言:javascript
复制
@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 ?我应该在哪里协商它?比方说我想

代码语言:javascript
复制
"Content-Type: application/vnd.company.book+json.v2"

我该从哪里说起呢?我应该添加哪些新的类/函数来处理同一资源的这个v2?

我找不到一个涵盖所有方面的好教程。

EN

回答 1

Stack Overflow用户

发布于 2017-04-06 22:56:56

我想我的第一个问题很容易解决,标题没有初始化,所以当我调用/

/1时,我得到的标题是:空。

您正在以错误的方式使用BookResource。我假设您的域对象(Book)如下所示:

代码语言:javascript
复制
public class Book {
    public String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

}

BookResource是一个包装器,它将链接添加到域对象,并以RESTful方式表示它……

代码语言:javascript
复制
public class BookResource extends Resource<Book> {

    public BookResource(Book content, Link... links) {
        super(content, links);
    }

}

根据记录,在这种情况下,您甚至不需要自定义的Resource和ResourceAssembler类:

代码语言:javascript
复制
@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中解释的内容类似。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43063297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档