Многократная сортировка Необязательный запрос - конфигурация Spring REST Controller с разбиением на страницы - PullRequest
0 голосов
/ 19 февраля 2019

Я хочу построить пружинный контроллер, который может обрабатывать несколько дополнительных запросов сортировки.Согласно спецификации spring.io эти запросы должны быть отформатированы следующим образом:

&sort=name,desc&sort=code,desc

Как обсуждено EduardoFernandes

Я знаю, что это можно сделать с помощьюодин экземпляр сортировки со значением, подлежащим сортировке, и указанием направления отдельно в соответствии с Gregg , но это не соответствует спецификации Spring или обрабатывает несколько значений сортировки.

Я не уверен, какпревратить несколько запросов в весеннем спецификационном формате в сортировку, которую я могу передать в свой PageRequest и затем в свой репозиторий.Также мне хотелось бы иметь возможность сделать это необязательным, и, если возможно, было бы здорово, если бы я мог использовать конфигурацию на основе @Anotation, если для достижения этого необходимы значения по умолчанию Rasheed Amir (@SortDefault)

Вот основы того, с чем я работаю ..

Домен

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Subject {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String code; 
...

Репозиторий

public interface SubjectRepository extends JpaRepository<Subject, Long> {
}

Сервис

@Override
public Page<SubjectDTO> listSubjectsPageble(PageRequest pageableRequest) {
    return subjectRepository.findAll(pageableRequest)
            .map(subjectMapper::subjectToSubjectDTO);
}

Контроллер

@GetMapping
@ResponseStatus(HttpStatus.OK)
@PreAuthorize("hasRole('LECTURER')")
public Page<SubjectDTO> getSubjects(
        @RequestParam("page") int page,
        @RequestParam("size") int size,
        @RequestParam("sort") String sort

) {

    return subjectService.listSubjectsPageble(PageRequest.of(page, size, new Sort(sort)));
}

Так что здесь, в контроллере, я не знаю, что делать сЗаполнить сортировку из RequestParam вообще, согласно Ralph Я должен иметь возможность использовать что-то вроде ниже, чтобы получить несколько значений из одного параметра, но я не знаю, как затем передать это вСортировка.

Я знаю, что сортировка может принимать более одного параметра, но только одно направление сортировки.И потом, конечно, я хотел бы сделать их необязательными.

@RequestParam MultiValueMap<String, String> params

Пожалуйста, помогите, я все еще довольно нуб :) :) * Спасибо

РЕДАКТИРОВАТЬ

Я решил некоторые из моих проблем благодаря сообщению Dullimeister Но подход выглядит немного грязным и все еще не обрабатывает несколько параметров сортировки.Кто-нибудь знает о лучшем подходе или это путь?

@GetMapping
    @ResponseStatus(HttpStatus.OK)
    @PreAuthorize("hasRole('LECTURER')")
    public Page<SubjectDTO> getSubjects(
            @RequestParam(value = "page", defaultValue = "0", required = false) int page,
            @RequestParam(value = "size", defaultValue = "10", required = false) int size,
            @RequestParam(value = "sort", defaultValue = "name,ASC", required = false) String sortBy

    ) {
        String[] sort = sortBy.split(",");
        String evalSort = sort[0];
        String sortDirection = sort[1];
        Sort.Direction evalDirection = replaceOrderStringThroughDirection(sortDirection);
        Sort sortOrderIgnoreCase = Sort.by(new Sort.Order(evalDirection,evalSort).ignoreCase());

        return subjectService.listSubjectsPageble(PageRequest.of(page, size, sortOrderIgnoreCase));
    }

    private Sort.Direction replaceOrderStringThroughDirection(String sortDirection) {
        if (sortDirection.equalsIgnoreCase("DESC")){
            return Sort.Direction.DESC;
        } else {
            return Sort.Direction.ASC;
        }
    }

Окончательное решение Спасибо всем, это то, что я закончил.Не уверен, что это идеальный способ, но он работает :) В конце мне пришлось заменить запятую точкой с запятой, поскольку FormattingConversionService автоматически разбирал один параметр сортировки в строке вместо Sting []

@GetMapping
@ResponseStatus(HttpStatus.OK)
@PreAuthorize("hasRole('LECTURER')")
public Page<SubjectDTO> getSubjects(
        @RequestParam(value = "page", defaultValue = "0", required = false) int page,
        @RequestParam(value = "size", defaultValue = "10", required = false) int size,
        @RequestParam(value = "sort", defaultValue = "name;ASC", required = false) String[] sortBy

Sort allSorts = Sort.by(
        Arrays.stream(sortBy)
                .map(sort -> sort.split(";", 2))
                .map(array ->
                        new Sort.Order(replaceOrderStringThroughDirection(array[1]),array[0]).ignoreCase()
                ).collect(Collectors.toList())
);
return subjectService.listSubjectsPageble(PageRequest.of(page, size, allSorts));

private Sort.Direction replaceOrderStringThroughDirection(String sortDirection) {
    if (sortDirection.equalsIgnoreCase("DESC")){
        return Sort.Direction.DESC;
    } else {
        return Sort.Direction.ASC;
    }

1 Ответ

0 голосов
/ 20 февраля 2019

Почему вы не используете Pageable в вашем контроллере?

Pageable может обрабатывать много запросов сортировки, каждый из которых будет сохранен в списке заказов.Более того, ни один из параметров для постраничного ввода не требуетсяЕсли вы не передадите их в URL, pageable будет содержать значения по умолчанию (page = 0, size = 20).Вы можете изменить значения по умолчанию, используя аннотацию @PageableDefault.

GET ... / test? Sort = name, desc & sort = code, desc enter image description here

...