Configurer le contrôleur de manière à pouvoir activer/désactiver des trieurs optionnels en fonction de l'entrée du contrôleur

voix
43

J'essaie d'écrire un terminal qui permet l'utilisation de trieurs optionnels dans le backend.

Par exemple, j'ai un trieur qui me permet de trier les éléments d'une liste - ce que retourne le contrôleur de mon endpoint - en fonction de leur date de création. Si le paramètre correspondant du contrôleur est vrai, les éléments sont triés en commençant par le plus récent et en allant vers le plus ancien. Si le paramètre correspondant est faux, c'est le contraire qui se produit.

Il s'agit d'un projet Spring Boot.

Je me demandais s'il y avait une façon plus appropriée de réaliser ce projet ?

C'est mon contrôleur :

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

En fonction de la valeur vraie/fausse des deux derniers paramètres sortStartingFromHighestGradeet sortStartingFromEarliestDate, un traitement différent est effectué en arrière-plan dans la classe de service.

Créé 15/05/2020 à 21:22
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Vous pouvez implémenter le tri avec Spring avec le support de Pageable.

Vous allez créer un objet Pageable pour obtenir les données de la base de données.

Vous devez utiliser PagingAndSortingRepositorypour les données de printemps :

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Integer> {

Et appelez régulièrement .findAll(pageable)avec n'importe quelle option de tri pour votre entité à la couche service.

Et votre contrôleur ressemblera à quelque chose comme :

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

Si vous ne voulez pas revenirPage<Entity>, vous pouvez le convertir en Liste dans la couche service.

MISE À JOUR :

Au lieu de créer Pageable object par PageRequest.of(), vous pouvez le passer directement par URL :

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

gradese trouve un champ de la classe de l'élève.

ou

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

Tous les paramètres sont reconnus en interne par le pageable comme suit :

page - Page number

size - Page Size

sort - sort by (Order by)

direction - ASC / DESC

Alors votre contrôleur devrait l'être :

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

Références utiles :

Créé 17/05/2020 à 22:53
source utilisateur

voix
0

Le printemps peut être utile de multiples façons ici :

  1. Du point de vue de Spring MVC, vous n'avez pas besoin de fournir tous les paramètres de demande dans des variables séparées, mais vous pouvez définir une classe avec tous ces paramètres et Spring les mettra en correspondance pour vous :
public class Params {
  private Instant startDate;
  private Instant endDate;
  private int page = 0;
  private int size = 10;
  ... constructor/getters/setters ...
}

Ensuite, dans votre contrôleur, vous pouvez faire ce qui suit, l'IMHO, semble plus propre :

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

Comme @nazar_art l'a mentionné, vous pouvez utiliser le support pageable des données de printemps si vous avez des données de printemps. Sinon, vous devrez l'implémenter vous-même, ce qui n'est pas très important de toute façon.

Créé 21/05/2020 à 15:46
source utilisateur

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