Configurare il controllore in modo che i selezionatori opzionali possano essere abilitati/disabilitati in base all'ingresso del controllore

voti
43

Sto cercando di scrivere un endpoint che permetta l'uso di selezionatori opzionali nel backend.

Per esempio, ho un sorter che mi permette di ordinare gli elementi in una lista - che è ciò che il mio controller del mio endpoint restituisce - in base alla loro data di creazione. Se il parametro del controllore corrispondente è vero, allora gli elementi vengono ordinati partendo dal più recente e spostandosi verso il più vecchio. Se il parametro corrispondente è falso, allora il contrario.

Questo è un progetto Spring Boot.

Mi chiedevo se c'è un modo più adatto alla primavera per raggiungere questo obiettivo?

Questo è il mio 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);
    }
}

A seconda del valore vero / falso degli ultimi due parametri sortStartingFromHighestGradee sortStartingFromEarliestDate, nella classe di servizio avviene un'elaborazione diversa in background.

È pubblicato 15/05/2020 alle 21:22
fonte dall'utente
In altre lingue...                            


2 risposte

voti
0

Si può implementare l'ordinamento con molla con supporto Pageable.

Si creerà un oggetto Pageable per ottenere i dati da DB.

Devi usare PagingAndSortingRepositoryper i dati di primavera:

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Integer> {

E chiamare regolarmente .findAll(pageable)con qualsiasi opzione di ordinamento per la vostra entità al livello di servizio.

E il vostro controllore avrà un aspetto simile:

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

Se non si vuole tornare Page<Entity>indietro si può convertire in List al livello di servizio.

AGGIORNAMENTO:

Invece di creare Pageable oggetto da PageRequest.of(), si potrebbe passare direttamente per URL:

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

dove gradec'è un campo della classe degli studenti.

oppure

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

Tutti i parametri riconosciuti internamente da Pageable come segue:

page - Page number

size - Page Size

sort - sort by (Order by)

direction - ASC / DESC

Allora il vostro controllore dovrebbe essere:

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

Riferimenti utili:

Risposto il 17/05/2020 a 22:53
fonte dall'utente

voti
0

Qui la primavera può essere utile in molti modi:

  1. Dal punto di vista della Spring MVC non è necessario fornire tutti i parametri della richiesta in variabili separate, ma è possibile definire una classe con tutti questi parametri e la Spring li mapperà per voi:
public class Params {
  private Instant startDate;
  private Instant endDate;
  private int page = 0;
  private int size = 10;
  ... constructor/getters/setters ...
}

Poi nel vostro controller potete fare quanto segue, IMHO, sembra più pulito:

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

Come ha detto @nazar_art, potete usare il supporto Pageable dei dati della molla se avete i dati della molla, altrimenti dovrete implementarli voi stessi, il che non è comunque un grosso problema.

Risposto il 21/05/2020 a 15:46
fonte dall'utente

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