Konfigurer kontrolleren på en måte som valgfrie sorterere kan aktiveres / deaktiveres basert på kontrollerens inngang

stemmer
43

Jeg prøver å skrive et endepunkt som gjør det mulig å bruke valgfrie sorterere i backend.

For eksempel har jeg en sortering som lar meg sortere elementer i en liste - som er det endepunktets kontroller returnerer - basert på opprettelsesdatoen. Hvis den korresponderende kontrollerparameteren er sann, sorteres elementene fra det nyeste og beveger seg mot den eldste. Hvis den korresponderende parameteren er falsk, er det motsatte.

Dette er et Spring Boot-prosjekt.

Jeg lurte på om det er en mer vår-passende måte å oppnå dette på?

Dette er min kontroller:

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

Avhengig av den sanne / falske verdien av de to siste parameterne sortStartingFromHighestGrade og sortStartingFromEarliestDate , skjer forskjellig behandling i bakgrunnen på serviceklassen.

Publisert på 15/05/2020 klokken 21:22
kilden bruker
På andre språk...                            


2 svar

stemmer
0

Du kan implementere sortering med fjær med Pageable støtte.

Du oppretter et Pageable objekt for å hente dataene fra DB.

Du må bruke PagingAndSortingRepository for vårdata:

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Integer> {

Og ringe vanlig .findAll(pageable) med et hvilket som helst sorteringsalternativ for enheten din i tjenestelaget.

Og kontrolleren din vil se noe slik ut:

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

Hvis du ikke vil tilbake Page<Entity> kan du konvertere den til Liste på tjenestelaget.

OPPDATER:

I stedet for å lage Pageable objekt av PageRequest.of() , kan du sende det direkte med URL:

/ Vellykket? Side = 0 & size = 10 & sort = grade

hvor grade er et felt fra Studentklasse .

eller

/ Vellykket? Side = 0 & size = 10 & sort = klasse, spør

Alle parametere gjenkjennes internt av Pageable som følgende:

page - Page number

size - Page Size

sort - sort by (Order by)

direction - ASC / DESC

Da bør kontrolleren være:

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

Nyttige referanser:

Svarte 17/05/2020 kl. 22:53
kilden bruker

stemmer
0

Våren kan komme til nytte på flere måter her:

  1. Fra vår MVC-synspunkt trenger du ikke å oppgi alle forespørselsparametere i separate variabler, i stedet kan du definere en klasse med alle disse parametrene, og våren vil kartlegge dem for deg:
public class Params {
  private Instant startDate;
  private Instant endDate;
  private int page = 0;
  private int size = 10;
  ... constructor/getters/setters ...
}

I kontrolleren din kan du gjøre følgende, IMHO, ser mer ren ut:

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

Som @nazar_art har nevnt, kan du bruke Pageable støtte for vårdata hvis du har vårdata. Ellers må du implementere dem av deg selv, noe som ikke er så veldig bra.

Svarte 21/05/2020 kl. 15:46
kilden bruker

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