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

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

Если соответствующий параметр контроллера равен true, то элементы сортируются, начиная с самого нового и перемещаясь к самому старому .

Если соответствующий параметр false, то противоположный .

Это проект Spring Boot.

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

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

@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

Различная обработка происходит в фоновом режиме в классе обслуживания.

0
user13123978 15 Май 2020 в 22:22

4 ответа

Лучший ответ

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

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

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

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

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

1
Mark Bramnik 21 Май 2020 в 13:46

Если вы спрашиваете на уровне API, то это не связано с Spring, а скорее с дизайном REST API, и здесь можно использовать несколько нотаций

GET ...&sort=+grade and GET ...&sort=-grade
GET ...&sort=grade.asc and GET ...&sort=grade.desc
GET ...&sort=asc(grade) and GET ...&sort=desc(grade)

Для большего количества параметров

GET ...&sort=+grade&sort=-age
GET ...&sort=+grade,-age

Для весенней части взгляните на https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Sort.Direction.html а также https: // docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/PageRequest.html

1
Muhammad Durrah 24 Май 2020 в 20:58

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

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

Вы можете использовать PagingAndSortingRepository для Spring Data:

public interface StudentRepository extends PagingAndSortingRepository<Student, 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>, вы можете преобразовать его в List на слое сервиса.

< Сильный > < EM> UPDATE :

Вместо создания объекта Pageable с помощью PageRequest.of() вы можете передать его напрямую по URL:

/ Успешно? Страница = 0 & размер = 10 & рода = оценка

Где grade - это поле из класса Student .

Или

/ Успешно? Страница = 0 & размер = 10 & рода = оценка , спросите

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

page - Page number

size - Page Size

sort - sort by (Order by)

direction - ASC / DESC

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

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

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

3
nazar_art 23 Май 2020 в 19:58

Если обработка на бэкэнде действительно отличается, то вы можете определить разные конечные точки с тем же path, но другим полем params, которое позволяет определять дополнительные условия, см. @GetMapping документацию по аннотациям и пример в создать два метода для одного шаблона URL с разными аргументами

1
Alexander Pavlov 24 Май 2020 в 03:17