Я хочу построить пружинный контроллер, который может обрабатывать несколько дополнительных запросов сортировки.Согласно спецификации 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;
}