2015-11-08 6 views
2

Я хочу разрешить разбиение на страницы в REST API, который я пишу. Я хотел бы отправить запрос следующимЧистый способ привязки @RequestParam к объекту вместо простого типа

GET /people?page[number]=1page[size]=25 

или, может быть,

GET /people?page.number=1page.size=25 
  • Запрос выше является лишь примером того, что я пытаюсь сделать, если вы знаете, более чистого способа отправить просьба пожалуйста, сообщите.

Тогда

@RequestMapping(value = "/people", params = { "page" }) 
public void findAll(@RequestParam("page") PaginationInformation paginationInformation) { 

} 

PaginationInformation просто обычный старый POJO с number и size добытчиками и сеттеров.

Возможно ли это в последней версии Spring? Я понимаю, что могу просто передать pageNumber и pageSize и привязать как целые числа, но я бы предпочел использовать и объект, так как хочу также поддерживать фильтрацию, которая будет намного сложнее.

+0

У Spring Data есть встроенная 'Pageable' с готовыми картами и поддержкой репозитория. – chrylis

ответ

2

Вы можете связать параметры запроса на пользовательские объекты модели весной, как это:

public class Page { 
    private int pageOffset; 
    private int pageSize; 

    // Getters and setters omitted 
} 

@RequestMapping("/people") 
public void findAll(Page page) { 
} 

Если вы посылаете запрос как GET /foo?pageOffset=0&pageSize=25 то параметр page будет заполненным этими значениями. Обратите внимание также, что нет аннотации @RequestParam.

Решено Page объект будет предоставлен обработчику ServletModelAttributeMethodProcessor под капотом, поэтому не стесняйтесь смотреть его исходный код для получения более подробной информации.

Если вам нужно больше гибкости при настройке разрешения параметров поискового вызова, вы можете реализовать пользовательский HandlerMethodArgumentResolver. Вы можете использовать PageableHandlerMethodArgumentResolver от Spring Data JPA в качестве вдохновения, если вы решите пойти этим путем (или используйте Spring Data JPA для вашего уровня персистентности).

+0

Это выглядит хорошо. Поэтому, когда у меня есть объект «FilterInformation», я могу предоставить два или более объектов правильно? 'public void findAll (страница страницы, фильтры фильтров, сортировка сортировки)' и префикс всего поля внутри фильтра pojo с fitlerXXX. Правильно ли это звучит? – jax

+0

@jax Yup, это должно работать. Но для того, чтобы быть понятным, вы указываете «FilterInformation», а затем «Фильтры» в своем комментарии. Это должен быть один и тот же класс или разные классы? –

+0

Да, извините, они такие же. – jax

1

Bohuslav Burghardt объяснил в своем ответе самый простой способ: с помощью объекта command-object/form-backing-object выбрать два параметра. Вы четко задали вопрос:

Возможно ли это в последней версии Spring?

Поскольку я думаю, что способ командного объекта хорошо известен, вы попросили другой, более мощный, способ. Да, есть один (он существует с весны 3.1).

HandlerMethodArgumentResolver.

Потому что у вас есть специальный прецедент: пейджинг; Я не буду объяснять, как именно нужно разработать HandlerMethodArgumentResolver.Вместо этого я рекомендую вам взглянуть на:

(возможно this answer мой помогает вам немного понять, как бороться с HandlerMethodArgumentResolver и как их зарегистрировать)

Таким образом, вы можете разработать свой собственный HandlerMethodArgumentResolver или просто использовать PageableHandlerMethodArgumentResolver форму пружинного данных.