Настройте контроллер таким образом, чтобы опциональные сортировщики могли быть включены/выключены в зависимости от входа контроллера

голоса
43

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

Например, у меня есть сортировщик, который позволяет мне сортировать элементы в списке - а это то, что возвращает контроллер моей конечной точки - по дате их создания. Если соответствующий параметр контроллера верен, то сортировка элементов начинается с самого нового и переходит к самому старому. Если соответствующий параметр равен false, то наоборот.

Это проект Пружинный загрузчик.

Мне интересно, есть ли более подходящий для пружин способ достичь этого?

Это мой контроллер:

@RestController
public class StudentsController{
    @Autowired
    private GradeBook yearlyGrades;

    @GetMapping(/successful)
    public List<Student> getSuccessfulStudents(
        @RequestParam(name = startDate) Instant startDate,
        @RequestParam(name = endDate) Instant endDate,
        @RequestParam(defaultValue = false, required = false) boolean sortStartingFromHighestGrade,
        @RequestParam(defaultValue = false, required = false) boolean sortStartingFromEarliestDate) {


        return this.yearlyGrades.getSuccessfulStudents(startDate, endDate, 
                                                       sortStartingFromHighestGrade, 
                                                       sortStartingFromEarliestDate);
    }
}

В зависимости от значения true/false двух последних параметров sortStartingFromHighestGradeиsortStartingFromEarliestDate, в фоновом режиме, в классе обслуживания происходит различная обработка.

Задан 15/05/2020 в 21:22
источник пользователем
На других языках...                            


2 ответов

голоса
0

Вы можете реализовать сортировку с помощью пружины с поддержкой Pageable.

Вы создадите объект Pageable для получения данных из БД.

Вы должны использовать PagingAndSortingRepositoryдля данных Spring:

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Integer> {

И регулярно .findAll(pageable)звоните с помощью любой опции Сортировка для объекта на уровне обслуживания.

И ваш контроллер будет выглядеть как:

@GetMapping
public Page<Student> getSuccessfulStudents(
        @RequestParam(name = "startDate") Instant startDate,
        @RequestParam(name = "endDate") Instant endDate,
        @RequestParam(value = "page", required = false, defaultValue = "0") int page,
        @RequestParam(value = "size", required = false, defaultValue = "10") int size) {
    return yearlyGrades.getSuccessfulStudents(startDate, endDate,
                 PageRequest.of(page, size, Sort.by("propertyFromClass")));
}

Если вы не хотите возвращатьсяPage<Entity>, вы можете преобразовать его в список на служебном уровне.

UPDATE:

Вместо того, чтобы создавать Страница Объект за PageRequest.of()объектом, вы можете передать его непосредственно по URL:

/successful?page=0&size=10&sort=grade

где gradeнаходится поле из класса "Студент".

или

/successful?page=0&size=10&sort=grade,ask

Все параметры внутренне распознаются компанией Pageable следующим образом:

page - Page number

size - Page Size

sort - sort by (Order by)

direction - ASC / DESC

Тогда ваш контроллер должен быть:

@GetMapping("/successful")
public List<Student> getSuccessfulStudents(
    @RequestParam(name = "startDate") Instant startDate,
    @RequestParam(name = "endDate") Instant endDate,
    Pageable pageable) {
    return yearlyGrades.getSuccessfulStudents(startDate, endDate, pageable);
}

Полезные ссылки:

Ответил 17/05/2020 в 22:53
источник пользователем

голоса
0

Здесь пружина может пригодиться несколькими способами:

  1. С точки зрения весны MVC не обязательно задавать все параметры запроса в отдельных переменных, вместо этого можно определить класс со всеми этими параметрами и весна отобразит их для Вас:
public class Params {
  private Instant startDate;
  private Instant endDate;
  private int page = 0;
  private int size = 10;
  ... constructor/getters/setters ...
}

Тогда в вашем контроллере вы можете сделать следующее, IMHO, выглядит более чисто:

@GetMapping
public Page<Student> getSuccessfulStudents(Params params) {
   ...
}

Как уже упоминалось в @nazar_art, Вы можете использовать страничную поддержку данных пружин, если у Вас есть данные пружин, в противном случае Вам придется реализовать это самостоятельно, что в любом случае не является большой проблемой.

Ответил 21/05/2020 в 15:46
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more