Ответ 1
Поддерживается такой сценарий, как этот, предстоящий в Spring HATEOAS и Spring Data Commons. Spring HATEOAS поставляется с объектом PageMetadata
, который по существу содержит те же данные, что и Page
, но менее строгим образом, так что он может быть легче маршалирован и немаршален.
Другим аспектом, который мы реализуем в сочетании с Spring HATEOAS и Spring Data commons, является то, что мало что нужно для простого маршалинга страницы, ее содержимого и метаданных, а также для создания ссылок, возможно, существующих следующей или предыдущих страниц, так что клиенту не нужно создавать URI для перемещения по этим страницам.
Пример
Предположим, что класс домена Person
:
class Person {
Long id;
String firstname, lastname;
}
а также соответствующий репозиторий:
interface PersonRepository extends PagingAndSortingRepository<Person, Long> { }
Теперь вы можете выставить контроллер Spring MVC следующим образом:
@Controller
class PersonController {
@Autowired PersonRepository repository;
@RequestMapping(value = "/persons", method = RequestMethod.GET)
HttpEntity<PagedResources<Person>> persons(Pageable pageable,
PagedResourcesAssembler assembler) {
Page<Person> persons = repository.findAll(pageable);
return new ResponseEntity<>(assembler.toResources(persons), HttpStatus.OK);
}
}
Вероятно, здесь немного объяснять. Позвольте сделать шаг за шагом:
- У нас есть контроллер Spring MVC, который подключает репозиторий к нему. Для этого требуется Spring Настройка данных (через
@Enable(Jpa|Mongo|Neo4j|Gemfire)Repositories
или эквиваленты XML). Метод контроллера сопоставляется с/persons
, что означает, что он примет все запросыGET
к этому методу. - Тип ядра, возвращаемый из метода, представляет собой
PagedResources
- тип из Spring HATEOAS, который представляет некоторый контент, обогащенныйLinks
плюс aPageMetadata
. -
При вызове метода Spring MVC придется создавать экземпляры для
Pageable
иPagedResourcesAssembler
. Чтобы получить эту работу, вам необходимо включить веб-поддержку Spring Data, либо через аннотацию@EnableSpringDataWebSupport
, которая должна быть представлена в предстоящей вехе Spring Data Commons, либо через автономные определения bean (документально здесь).Pageable
будет заполнена информацией из запроса. Конфигурация по умолчанию превратит?page=0&size=10
вPageable
, запрашивая первую страницу, размером страницы 10.PageableResourcesAssembler
позволяет вам легко превратитьPage
в экземплярыPagedResources
. Он не только добавит метаданные страницы в ответ, но и добавит соответствующие ссылки к представлению на основе той страницы, на которую вы получаете доступ, и как настроено ваше разрешениеPageable
.
Пример конфигурации JavaConfig для включения этого для JPA будет выглядеть следующим образом:
@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
@EnableJpaRepositories
class ApplicationConfig {
// declare infrastructure components like EntityManagerFactory etc. here
}
Пример запроса и ответа
Предположим, что в базе данных 30 Persons
. Теперь вы можете вызвать запрос GET http://localhost:8080/persons
, и вы увидите что-то похожее на это:
{ "links" : [
{ "rel" : "next", "href" : "http://localhost:8080/persons?page=1&size=20 }
],
"content" : [
… // 20 Person instances rendered here
],
"pageMetadata" : {
"size" : 20,
"totalElements" : 30,
"totalPages" : 2,
"number" : 0
}
}
Обратите внимание, что ассемблер создал правильный URI, а также отображает конфигурацию по умолчанию, чтобы разрешить параметры в Pageable
для предстоящего запроса. Это означает, что если вы измените эту конфигурацию, ссылки будут автоматически привязаны к изменению. По умолчанию ассемблер указывает на метод контроллера, к которому он был вызван, но который можно настроить, передав пользовательский Link
, который будет использоваться в качестве базы для создания ссылок на страницы с перегрузками метода PagedResourcesAssembler.toResource(…)
.
Outlook
Биты PagedResourcesAssembler
будут доступны в следующем выпуске релиза Spring Data Babbage . Он уже доступен в текущих моментальных снимках. Вы можете увидеть рабочий пример этого приложения Spring RESTBucks . Просто клонируйте его, запустите mvn jetty:run
и закрутите http://localhost:8080/pages
.