查了一堆资料,一直都没见到高版本的hateosa示例,好在自己折腾来折腾去写了一个,也差不多能用了。贴出来有需要的也能参考参考。
pom.xml主要相关部分:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
简单的实体类:
public class Book{
private Integer id;
private String bookName;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
}
对应这个实体类的辅助类:
package com.keke.hateoas.pojo;
import com.keke.hateoas.controller.BookController;
import org.springframework.hateoas.CollectionModel;
import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.server.RepresentationModelAssembler;
import org.springframework.hateoas.server.mvc.MvcLink;
import java.util.ArrayList;
import java.util.Iterator;
public class BookModelAssemble implements RepresentationModelAssembler<Book, EntityModel<Book>> {
@Override
public EntityModel<Book> toModel(Book entity) {
return new EntityModel<>(entity, MvcLink.of(MvcLink.on(BookController.class).getOne(entity.getId())).withSelfRel());
}
@Override
public CollectionModel<EntityModel<Book>> toCollectionModel(Iterable<? extends Book> entities) {
ArrayList<EntityModel<Book>> list = new ArrayList<>();
Iterator<? extends Book> iterator = entities.iterator();
while (iterator.hasNext()){
Book book = iterator.next();
list.add(toModel(book));
}
return new CollectionModel<>(list,
MvcLink.of(MvcLink.on(BookController.class).getList()).withSelfRel(),
MvcLink.of(MvcLink.on(BookController.class).getOne(1)).withRel("item"),
MvcLink.of(MvcLink.on(BookController.class).getPageList(1, 10)).withRel("page")
);
}
}
只写controller层了,介绍下返回值怎么处理(还要研究手动分页 ┭┮﹏┭┮):
package com.keke.hateoas.controller;
import com.keke.hateoas.pojo.Book;
import com.keke.hateoas.pojo.BookModelAssemble;
import com.keke.hateoas.util.HalUtil;
import org.springframework.hateoas.*;
import org.springframework.hateoas.server.mvc.MvcLink;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
@RequestMapping("/books")
public class BookController {
private final BookModelAssemble bookModelAssemble = new BookModelAssemble();
@GetMapping("/{id}")
public EntityModel<Book> getOne(@PathVariable("id") Integer id){
Book book = new Book();
book.setId(id);
book.setBookName("HAL入门");
EntityModel<Book> bookResource = bookModelAssemble.toModel(book);
return bookResource;
}
@GetMapping("")
public CollectionModel<EntityModel<Book>> getList(){
Book book = new Book();
book.setId(1);
book.setBookName("HAL入门");
Book book1 = new Book();
book1.setId(2);
book1.setBookName("HAL进阶");
List<Book> books = new ArrayList();
books.add(book);
books.add(book1);
CollectionModel<EntityModel<Book>> bookResources = bookModelAssemble.toCollectionModel(books);
return bookResources;
}
@GetMapping("/page")
public PagedModel<EntityModel<Book>> getPageList(@RequestParam Integer index, @RequestParam Integer size){
List<Book> books = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Book book = new Book();
book.setId(i);
book.setBookName("HAL入门"+i);
books.add(book);
}
int total = books.size();
int start = (index - 1) * size + 1 > total ? total : (index - 1) * size +1;
int end = start + size > total ? total : start + size;
System.out.println(start + "--" + end);
PagedModel.PageMetadata pageMetadata = new PagedModel.PageMetadata(size, index, total);
books = books.subList(start, end);
ArrayList<EntityModel<Book>> bookResources = new ArrayList<>();
for (Book book : books) {
bookResources.add(bookModelAssemble.toModel(book));
}
PagedModel<EntityModel<Book>> pagedMode = new PagedModel<>(bookResources, pageMetadata, getAllLinks());
return pagedMode;
}
private List<Link> getAllLinks(){
ArrayList<Link> links = new ArrayList<>();
links.add(MvcLink.of(MvcLink.on(BookController.class).getOne(1)).withRel("item"));
links.add(MvcLink.of(MvcLink.on(BookController.class).getList()).withRel("list"));
links.add(MvcLink.of(MvcLink.on(BookController.class).getPageList(1, 10)).withSelfRel());
return links;
}
@GetMapping("/self")
public List<Book> getSelf(){
List<Book> list = HalUtil.getList("http://127.0.0.1:8071/books", Book.class);
return list;
}
}
返回值的样子,多个对象:
{
"_embedded": {
"bookList": [
{
"id": 1,
"bookName": "HAL入门",
"_links": {
"self": {
"href": "http://127.0.0.1:8071/books/1"
}
}
},
{
"id": 2,
"bookName": "HAL进阶",
"_links": {
"self": {
"href": "http://127.0.0.1:8071/books/2"
}
}
}
]
},
"_links": {
"self": {
"href": "http://127.0.0.1:8071/books/"
},
"item": {
"href": "http://127.0.0.1:8071/books/1"
},
"page": {
"href": "http://127.0.0.1:8071/books/page?index=1&size=10"
}
}
}
返回值的样子,单个对象:
{
"id": 1,
"bookName": "HAL入门",
"_links": {
"self": {
"href": "http://127.0.0.1:8071/books/1"
}
}
}
返回值的样子,分页对象(?index=2&size=3):
{
"_embedded": {
"bookList": [
{
"id": 4,
"bookName": "HAL入门4",
"_links": {
"self": {
"href": "http://127.0.0.1:8071/books/4"
}
}
},
{
"id": 5,
"bookName": "HAL入门5",
"_links": {
"self": {
"href": "http://127.0.0.1:8071/books/5"
}
}
},
{
"id": 6,
"bookName": "HAL入门6",
"_links": {
"self": {
"href": "http://127.0.0.1:8071/books/6"
}
}
}
]
},
"_links": {
"item": {
"href": "http://127.0.0.1:8071/books/1"
},
"list": {
"href": "http://127.0.0.1:8071/books/"
},
"self": {
"href": "http://127.0.0.1:8071/books/page?index=1&size=10"
}
},
"page": {
"size": 3,
"totalElements": 10,
"totalPages": 4,
"number": 2
}
}
希望对大家有所帮助!