Configurați controlerul într-un mod în care sortatoarele opționale pot fi activate / dezactivate pe baza intrării controlorului

voturi
43

Încerc să scriu un punct final care să permită utilizarea sortoarelor opționale în backend.

De exemplu, am un sortator care îmi permite să sortez elemente dintr-o listă - ceea ce returnează controlorul meu de bază - pe baza datei de creare a acestora. Dacă parametrul controlerului corespunzător este adevărat, atunci elementele sunt sortate începând de la cele mai noi și trecând spre cele mai vechi. Dacă parametrul corespunzător este fals, atunci opusul.

Acesta este un proiect Spring Boot.

Mă întrebam dacă există un mod mai potrivit pentru primăvară pentru a realiza acest lucru?

Acesta este controlorul meu:

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

În funcție de valoarea adevărată / falsă a ultimilor doi parametri sortStartingFromHighestGrade și sortStartingFromEarliestDate , procesarea diferită se întâmplă în fundal la clasa de servicii.

Întrebat 15/05/2020 la 21:22
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
0

Puteți implementa sortarea cu ajutorul arcului cu suport Pageable .

Veți crea un obiect Pageable pentru obținerea datelor de la DB.

Trebuie să folosești PagingAndSortingRepository pentru datele de primăvară:

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Integer> {

Și sună regulat .findAll(pageable) cu orice opțiune de sortare pentru entitatea dvs. la nivelul serviciului.

Iar controlorul dvs. va arăta ceva de genul:

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

Dacă nu vrei să te întorci Page<Entity> îl puteți converti în List în stratul de servicii.

ACTUALIZAȚI:

În loc să creeze obiectul Pageable de PageRequest.of() , îl puteți transmite direct prin URL:

/ Succes? Page = 0 & size = 10 & sort = grad

Unde grade este un domeniu din clasa Student .

sau

/ Succes? Page = 0 & size = 10 & sort = grad, cere

Toți parametrii recunosc intern prin Pageable, după cum urmează:

page - Page number

size - Page Size

sort - sort by (Order by)

direction - ASC / DESC

Atunci controlorul dvs. ar trebui să fie:

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

Referințe utile:

Publicat 17/05/2020 la 22:53
sursa de către utilizator

voturi
0

Primăvara poate veni la îndemână în mai multe moduri aici:

  1. Din punct de vedere al Spring MVC, nu trebuie să furnizați toți parametrii solicitării în variabile separate, în schimb puteți defini o clasă cu toți acești parametri, iar spring-ul îi va face hartă pentru dvs.:
public class Params {
  private Instant startDate;
  private Instant endDate;
  private int page = 0;
  private int size = 10;
  ... constructor/getters/setters ...
}

Apoi, în controlerul dvs. puteți face următoarele, IMHO, arată mai curat:

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

Așa cum a menționat @nazar_art, puteți utiliza suportul Pageable pentru datele de primăvară dacă aveți date de primăvară. În caz contrar, va trebui să le implementați de unul singur, ceea ce oricum nu este mare lucru.

Publicat 21/05/2020 la 15:46
sursa de către utilizator

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