Konfigurieren Sie den Controller so, dass optionale Sortierer basierend auf den Eingaben des Controllers aktiviert/deaktiviert werden können

stimmen
43

Ich versuche, einen Endpunkt zu schreiben, der die Verwendung von optionalen Sortierern im Backend ermöglicht.

Ich habe zum Beispiel einen Sortierer, der es mir erlaubt, Elemente in einer Liste - die der Controller meines Endpunkts zurückgibt - anhand ihres Erstellungsdatums zu sortieren. Wenn der entsprechende Controller-Parameter wahr ist, werden die Elemente sortiert, beginnend mit dem neuesten und sich zum ältesten bewegend. Wenn der entsprechende Parameter falsch ist, dann ist das Gegenteil der Fall.

Dies ist ein Spring-Boot-Projekt.

Ich frage mich, ob es eine besser geeignete Methode gibt, dies zu erreichen?

Das ist mein Controller:

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

Je nach dem Wahr/Falsch-Wert der letzten beiden Parameter sortStartingFromHighestGradeund sortStartingFromEarliestDatefinden im Hintergrund bei der Service-Klasse unterschiedliche Verarbeitungen statt.

Veröffentlicht am 15/05/2020 um 21:22
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

Sie könnten eine Sortierung mit Spring mit Pageable-Unterstützung implementieren.

Sie werden ein Pageable-Objekt erstellen, um die Daten aus der DB zu erhalten.

Die Sie PagingAndSortingRepositoryfür Spring Data verwenden müssen:

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Integer> {

Und rufen Sie Regular .findAll(pageable)mit einer beliebigen Sortieroption für Ihre Entität auf der Serviceschicht auf.

Und Ihr Controller wird in etwa so aussehen:

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

Wenn Sie nicht zurückkehren Page<Entity>wollen, können Sie es in der Serviceschicht in Liste umwandeln.

AKTUALISIEREN:

Anstatt Auslagerbar object by PageRequest.of()sein, könnten Sie ihn direkt per URL übergeben:

/erfolgreich?page=0&size=10&sort=grad

wo gradeist ein Feld aus der Klasse Student.

oder

/erfolgreich?page=0&size=10&sort=grad,fragen

Alle Parameter werden intern von Pageable wie folgt erkannt:

page - Page number

size - Page Size

sort - sort by (Order by)

direction - ASC / DESC

Dann sollte Ihr Controller sein:

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

Nützliche Hinweise:

Beantwortet am 17/05/2020 um 22:53
quelle vom benutzer

stimmen
0

Der Frühling kann sich hier in mehrfacher Hinsicht als nützlich erweisen:

  1. Aus der Sicht von Spring MVC müssen Sie nicht alle Anforderungsparameter in separaten Variablen angeben, sondern Sie können eine Klasse mit all diesen Parametern definieren und Spring wird sie für Sie abbilden:
public class Params {
  private Instant startDate;
  private Instant endDate;
  private int page = 0;
  private int size = 10;
  ... constructor/getters/setters ...
}

Dann können Sie in Ihrem Controller Folgendes tun: IMHO sieht sauberer aus:

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

Wie @nazar_art erwähnt hat, können Sie die Pageable-Unterstützung von Frühlingsdaten nutzen, wenn Sie Frühlingsdaten haben. Andernfalls müssen Sie sie selbst implementieren, was ohnehin keine große Sache ist.

Beantwortet am 21/05/2020 um 15:46
quelle vom benutzer

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