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

voti
1

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