Skonfiguruj kontroler w taki sposób, aby opcjonalne sortowniki mogły być włączane/wyłączane na podstawie wejścia kontrolera

głosy
1

Próbuję napisać punkt końcowy, który pozwala na użycie opcjonalnych sorterów w backendzie.

Na przykład, mam sorter, który pozwala mi na sortowanie elementów na liście - co zwraca kontroler mojego punktu końcowego - na podstawie daty ich utworzenia. Jeśli odpowiedni parametr kontrolera jest prawdziwy to elementy są sortowane począwszy od najnowszego i przechodząc do najstarszego. Jeśli odpowiedni parametr jest fałszywy, to jest odwrotnie.

To jest projekt Spring Boot.

Zastanawiałem się, czy istnieje bardziej sprężynujący sposób, aby to osiągnąć?

To jest mój kontroler:

@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);
    }
}

W zależności od rzeczywistej/fałszywej wartości dwóch ostatnich parametrów sortStartingFromHighestGradei sortStartingFromEarliestDateróżne przetwarzanie odbywa się w tle w klasie usługi.

Utwórz 15/05/2020 o 21:22
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
0

Możesz wdrożyć sortowanie za pomocą sprężyny z obsługą Pageable.

Stworzysz obiekt Pageable do pobierania danych z DB.

Musisz użyć PagingAndSortingRepositorydo Spring Data:

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Integer> {

I zadzwoń regularnie .findAll(pageable)z dowolną opcją sortowania dla twojego podmiotu w warstwie usług.

A twój kontroler będzie wyglądał tak samo:

@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")));
}

Jeśli nie chcesz wracaćPage<Entity>, możesz przekonwertować go na Listę w warstwie usług.

UPDATE:

Zamiast tworzyć Websiteable obiekt przez PageRequest.of(), można przekazać go bezpośrednio przez adres URL:

/pomyślnie?strona=0&rozmiar=10&sort=klasa

gdzie gradejest pole z klasy studenckiej.

lub

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

Wszystkie parametry są wewnętrznie rozpoznawane przez Pageable jako następujące:

page - Page number

size - Page Size

sort - sort by (Order by)

direction - ASC / DESC

Wtedy twój kontroler powinien być:

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

Przydatne referencje:

Odpowiedział 17/05/2020 o 22:53
źródło użytkownik

głosy
0

Wiosna może się tu przydać na wiele sposobów:

  1. Z punktu widzenia Spring MVC nie musisz podawać wszystkich parametrów żądania w oddzielnych zmiennych, zamiast tego możesz zdefiniować klasę z tymi wszystkimi parametrami, a Spring zmapuje je dla Ciebie:
public class Params {
  private Instant startDate;
  private Instant endDate;
  private int page = 0;
  private int size = 10;
  ... constructor/getters/setters ...
}

Następnie w twoim kontrolerze możesz zrobić co następuje, IMHO, wygląda bardziej czysto:

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

Jak wspomniała @nazar_art, możesz korzystać z Pageable Support of Spring data, jeśli posiadasz dane o sprężynie W przeciwnym razie będziesz musiał zaimplementować je sam, co i tak nie jest dużą sprawą.

Odpowiedział 21/05/2020 o 15:46
źródło użytkownik

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