【发布时间】:2016-12-01 23:49:36
【问题描述】:
我有几个自动创建 REST 端点的控制器。
@RepositoryRestResource(collectionResourceRel = "books", path = "books")
public interface BooksRepository extends CrudRepository<Books, Integer> {
public Page<Books> findTopByNameOrderByFilenameDesc(String name);
}
当我访问时:http://localhost:8080/Books
我回来了:
{
"_embedded": {
"Books": [{
"id": ,
"filename": "Test123",
"name": "test123",
"_links": {
"self": {
"href": "http://localhost:8080/books/123"
},
"Books": {
"href": "http://localhost:8080/books/123"
}
}
}]
},
"_links": {
"self": {
"href": "http://localhost:8080/books"
},
"profile": {
"href": "http://localhost:8080/profile/books"
},
"search": {
"href": "http://localhost:8080/books/search"
},
"page": {
"size": 20,
"totalElements": 81,
"totalPages": 5,
"number": 0
}
}
}
当我创建自己的控制器时:
@Controller
@RequestMapping(value = "/CustomBooks")
public class CustomBooksController {
@Autowired
public CustomBookService customBookService;
@RequestMapping("/search")
@ResponseBody
public Page<Book> search(@RequestParam(value = "q", required = false) String query,
@PageableDefault(page = 0, size = 20) Pageable pageable) {
return customBookService.findAll();
}
}
我会得到一个与自动生成的控制器响应完全不同的响应:
{
"content": [{
"filename": "Test123",
"name" : "test123"
}],
"totalPages": 5,
"totalElements": 81,
"size": 20,
"number": 0,
}
我需要做什么才能使我的回复看起来像自动生成的回复?我想保持一致,所以我不必为不同的响应重写代码。我应该以不同的方式来做吗?
编辑: 发现这个:Enable HAL serialization in Spring Boot for custom controller method
但我不明白我需要在 REST 控制器中进行哪些更改才能启用:PersistentEntityResourceAssembler。我在 Google 上搜索了 PersistentEntityResourceAssembler,但它不断引导我回到类似的页面而没有太多示例(或者该示例似乎对我不起作用)。
【问题讨论】:
-
你试过
@ResourceRestController吗? -
不确定我是否正确理解了您的问题,但我猜您正在寻找的是 HATEOAS spring.io/guides/gs/rest-hateoas
-
一个返回一个 Page
另一个返回一个 Page (注意 s),但我猜这是一个错字? -
@chrylis 我认为没有“@ResourceRestController”?你的意思是“@RestController”吗?
-
@KevinVasko 我的错误——它是
@RepositoryRestController,正如 Alex 指出的那样。
标签: java spring spring-data spring-data-rest spring-rest