Configureer de controller zodanig dat optionele sorteerders kunnen worden in-/uitgeschakeld op basis van de ingang van de controller

stemmen
43

Ik probeer een eindpunt te schrijven dat het gebruik van optionele sorteermachines in de backend mogelijk maakt.

Ik heb bijvoorbeeld een sorteermachine waarmee ik elementen in een lijst kan sorteren - dat is wat de controller van mijn eindpunt teruggeeft - op basis van hun aanmaakdatum. Als de corresponderende controllerparameter waar is, dan worden de elementen gesorteerd vanaf het nieuwste en gaan ze naar het oudste. Als de corresponderende parameter vals is, dan is het tegenovergestelde het geval.

Dit is een Spring Boot project.

Ik vroeg me af of er een betere manier is om dit te bereiken?

Dit is mijn 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);
    }
}

Afhankelijk van de waar/onwaar waarde van de laatste twee parameters sortStartingFromHighestGradeen sortStartingFromEarliestDate, gebeurt er een verschillende verwerking op de achtergrond bij de serviceklasse.

De vraag is gesteld op 15/05/2020 om 21:22
bron van user
In andere talen...                            


2 antwoorden

stemmen
0

U zou het sorteren met veer kunnen implementeren met Pageable-ondersteuning.

U maakt een Pageable-object aan om de gegevens uit de DB te halen.

U moet deze gebruiken PagingAndSortingRepositoryvoor Spring Data:

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Integer> {

En bel regelmatig .findAll(pageable)met elke Sorteeroptie voor uw entiteit in de servicelaag.

En je controller zal er zo uitzien:

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

Als u niet wilt terugkerenPage<Entity>, kunt u het converteren naar Lijst op de servicelaag.

UPDATE:

In plaats van het creëren van Paginabare object door PageRequest.of(), je zou het direct kunnen doorgeven via URL:

/succesvol? page=0&size=10&sort=grade

waar gradeeen veld is van de studentenklasse.

of

/succesvol? page=0&size=10&sort=grade,ask

Alle parameters worden door Pageable intern als volgt herkend:

page - Page number

size - Page Size

sort - sort by (Order by)

direction - ASC / DESC

Dan zou uw controller dat moeten zijn:

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

Nuttige referenties:

antwoordde op 17/05/2020 om 22:53
bron van user

stemmen
0

De lente kan hier op meerdere manieren van pas komen:

  1. Vanuit het oogpunt van Spring MVC hoeft u niet alle aanvraagparameters in afzonderlijke variabelen aan te leveren, maar kunt u een klasse met al deze parameters definiëren en de veer zal deze voor u in kaart brengen:
public class Params {
  private Instant startDate;
  private Instant endDate;
  private int page = 0;
  private int size = 10;
  ... constructor/getters/setters ...
}

Dan kunt u in uw controller het volgende doen, IMHO, ziet er schoner uit:

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

Zoals @nazar_art heeft vermeld, kunt u gebruik maken van Pageable-ondersteuning van veerdata als u veergegevens heeft Anders moet u deze zelf implementeren, wat toch niet zo erg is.

antwoordde op 21/05/2020 om 15:46
bron van user

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