Ответ Spring REST отличается в пользовательском контроллере
У меня есть несколько контроллеров, которые автоматически создают 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,
}
Что мне нужно сделать, чтобы мой ответ выглядел как автоматически сгенерированный ответ? Я хочу, чтобы он был согласованным, поэтому мне не нужно переписывать код для другого ответа. Должен ли я делать это по-другому?
Изменить: Найдено это: Включить сериализацию HAL в Spring Boot для пользовательского метода контроллера
Но я не понимаю, что мне нужно изменить в контроллере REST, чтобы включить: PersistentEntityResourceAssembler
, Я искал в Google для PersistentEntityResourceAssembler
, но это приводит меня к подобным страницам без особого примера (или этот пример, кажется, не работает для меня).
1 ответ
Как @chrylis предложил вам заменить @Controller
аннотация с @RepositoryRestController
для Spring-data-rest, чтобы вызвать его ResourceProcessors для настройки данного ресурса.
Чтобы ваш ресурс соответствовал спецификации HATEOAS (например, ваш Spring-data-rest BooksRepository), ваш тип возврата объявления метода должен быть таким: HttpEntity<PagedResources<Resource<Books>>>
Для преобразования вашего объекта Page в PagedResources:
Вам нужно автоматически связать этот объект.
@Autowired private PagedResourcesAssembler<Books> bookAssembler;
Ваше возвращение должно быть как
return new ResponseEntity<>(bookAssembler.toResource(customBookService.findAll()), HttpStatus.OK);
Эти изменения должны помочь вам получить ответ, соответствующий org.springframework.hateoas.Resources, содержащий "_embedded"
а также "_links
"атрибут.