Как собрать все поля, помеченные @RequestParam, в один объект - PullRequest
0 голосов
/ 06 июня 2019

Я хотел бы собрать все параметры моего запроса в pojo и выполнить дополнительную проверку полей.

Я прочитал, что могу просто создать объект, и spring-boot автоматически установит для него параметры запроса.

@GetMaping public ResponseEntity<?> listEntities(@RequestParam(value = "page-number", defaultValue = "0") @Min(0) Integer pageNumber, @RequestParam(value = "page-size", defaultValue = "100") @Min(1) Integer pageSize ... )

Я думаю создать класс с именем RequestParamsDTO, в котором мои параметры запроса отвечают за нумерацию страниц.

Но чтобы эти поля были установлены на RequestParamsDTO, мне нужно было бы сопоставить имя параметра запроса с именем поля. Но это не будет правильным именем переменной: page-size.

Должен быть какой-то обходной путь, похожий на атрибут значения @RequestParam, который установил бы данный параметр запроса для моего поля в DTO.

Пожалуйста, сообщите.

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Кто-то уже определил эту функцию ранее, чтобы вы могли сделать следующее. Но, к сожалению, она отклонена из-за реакции на неактивность:

public class RequestParamsDTO{
   @RequestParam(value="page-number",defaultValue="0")
   @Min(0)
   private Integer pageNumber;

   @RequestParam(value = "page-size", defaultValue = "100") 
   @Min(1) 
   Integer pageSize 
}

Наиболее похожие вещи, которые вы можете сделатьиспользует его @ModelAttribute, который разрешит параметр в следующих заказах :

  • из модели, если она уже добавлена ​​с использованием модели.
  • Из сеанса HTTP с использованием @ SessionAttributes.
  • Из переменной пути URI, передаваемой через конвертер (см. Следующий пример).
  • Из вызова конструктора по умолчанию.
  • От вызова «первичного конструктора» с аргументами, которые соответствуют параметрам запроса сервлета.Имена аргументов определяются через JavaBeans @ConstructorProperties или через имена параметров, сохраняемые во время выполнения в байт-коде.

Это означает, что RequestParamsDTO не может не иметь никакого конструктора по умолчанию (конструктор, который не имеет аргументов)У него должен быть «первичный конструктор», который можно использовать @ConstructorProperties, чтобы определить, какие параметры запроса сопоставляются с аргументами конструктора:

public class RequestParamsDTO{
    @Min(0)
    Integer pageNumber;
    @Min(1)
    Integer pageSize;

    @ConstructorProperties({"page-number","page-size"})
    public RequestParamsDTO(Integer pageNumber, Integer pageSize) {
        this.pageNumber = pageNumber != null ? pageNumber : 0;
        this.pageSize = pageSize != null ? pageSize : 100;
    }
}

И метод контроллера становится:

@GetMaping
public ResponseEntity<?> listEntities(@Valid RequestParamsDTO request){

}

Примечания:

  • Не существует эквивалентной аннотации для @RequestParam defaultValue, поэтому необходимо внедрить ее в конструктор вручную.

  • Если аргумент метода контроллера не совпадает со значениями в this , он будет разрешен как @ModelAttribute, хотя @ModelAttribute явно не аннотирован.

0 голосов
/ 06 июня 2019

Честно говоря, это кажется большим усилием для функциональности, которая уже существует в весенней загрузке.Вы можете либо расширить свои репозитории с PagingAndSortingRepository и добавлять нумерацию страниц при каждом вызове ресурса коллекции.

Или вы можете написать собственный метод запроса (или перезаписать существующий) и добавить его:

Page<Person> findByFirstname(String firstname, Pageable pageable);

Таким образом, весенняя загрузка автоматически добавит в запрос все те параметры, которые вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...