Guide rapide sur les variables de matrice Spring MVC

Guide rapide sur les variables de matrice MVC de Spring

1. Vue d'ensemble

La spécification d'URIRFC 3986 définit les paramètres de chemin d'URI comme des paires nom-valeur. Les variables matricielles sont un terme inventé par Spring et une implémentation alternative pour transmettre et analyser les paramètres de chemin URI.

La prise en charge des variables matricielles est devenue disponible dans Spring MVC 3.2 et est destinée àsimplify requests with a large number of parameters.

Dans cet article, nous montrerons comment simplifier les requêtes GET complexes qui utilisent des paramètres de chemin variables ou facultatifs à l’intérieur des différents segments de chemin d’un URI.

2. Configuration

Pour activer les variables matricielles Spring MVC, commençons par la configuration:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setRemoveSemicolonContent(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}

Sinon, ils sont désactivés par défaut.

3. Comment utiliser les variables matricielles

Ces variables peuvent apparaître dans n’importe quelle partie du chemin et le caractère égal ("=") est utilisé pour donner des valeurs et le point-virgule (";") pour délimiter chaque variable matricielle. Sur le même chemin, nous pouvons également répéter le même nom de variable ou séparer différentes valeurs à l’aide de la virgule (‘,’).

Notre exemple a un contrôleur qui fournit des informations sur les employés. Chaque employé a un espace de travail et nous pouvons effectuer une recherche en fonction de cet attribut. La requête suivante peut être utilisée pour la recherche:

http://localhost:8080/spring-mvc-java/employeeArea/workingArea=rh,informatics,admin

ou comme ceci:

http://localhost:8080/spring-mvc-java
  /employeeArea/workingArea=rh;workingArea=informatics;workingArea=admin

Lorsque nous voulons faire référence à ces variables dans Spring MVC, nous devons utiliser l'annotation@MatrixVariable.

Dans nos exemples, nous utiliserons la classeEmployee:

public class Employee {

    private long id;
    private String name;
    private String contactNumber;

    // standard setters and getters
}

Et aussi la classeCompany:

public class Company {

    private long id;
    private String name;

    // standard setters and getters
}

Ces deux classes lieront les paramètres de la requête.

4. Définition des propriétés de variable de matrice

Nous pouvons spécifier les propriétés requises ou par défaut pour la variable. Dans l'exemple suivant, lecontactNumber est requis, il doit donc être inclus dans notre chemin, quelque chose comme ceci:

http://localhost:8080/spring-mvc-java/employeesContacts/contactNumber=223334411

La demande sera traitée par la méthode suivante:

@RequestMapping(value = "/employeesContacts/{contactNumber}",
  method = RequestMethod.GET)
@ResponseBody
public ResponseEntity> getEmployeeBycontactNumber(
  @MatrixVariable(required = true) String contactNumber) {
    List employeesList = new ArrayList();
    ...
    return new ResponseEntity>(employeesList, HttpStatus.OK);
}

En conséquence, nous obtiendrons tous les employés qui ont le numéro de contact223334411.

5. Paramètre de complément

Les variables matricielles peuvent compléter les variables de chemin.

Par exemple, nous cherchons un employé pour son nom, mais nous pouvons également inclure les numéros de départ de son numéro de contact.

La requête pour cette recherche devrait être comme ceci:

http://localhost:8080/spring-mvc-java/employees/John;beginContactNumber=22001

La demande sera traitée par la méthode suivante:

@RequestMapping(value = "/employees/{name}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity> getEmployeeByNameAndBeginContactNumber(
  @PathVariable String name, @MatrixVariable String beginContactNumber) {
    List employeesList = new ArrayList();
    ...
    return new ResponseEntity<>(employeesList, HttpStatus.OK);
}

En conséquence, nous obtiendrons tous les employés qui ont le numéro de contact22001 ou dont le nom estJohn.

6. Lier toutes les variables matricielles

Si pour une raison quelconque, nous voulons obtenir toutes les variables disponibles sur le chemin, nous pouvons les lier à unMap:

http://localhost:8080/spring-mvc-java/employeeData/id=1;name=John;contactNumber=2200112334

Cette demande sera traitée par la méthode suivante:

@GetMapping("employeeData/{employee}")
@ResponseBody
public ResponseEntity> getEmployeeData(
  @MatrixVariable Map matrixVars) {
    return new ResponseEntity<>(matrixVars, HttpStatus.OK);
}

Bien sûr, nous pouvons limiter la liaison aux variables de matrice d’une partie spécifique du chemin. Par exemple, si nous avons une requête comme celle-ci:

http://localhost:8080/spring-mvc-java/
  companyEmployee/id=2;name=Xpto/employeeData/id=1;name=John;
  contactNumber=2200112334

Et nous voulons seulement obtenir toutes les variables qui appartiennent àemployeeData; alors nous devrions utiliser comme paramètre d'entrée ceci:

@RequestMapping(
 value = "/companyEmployee/{company}/employeeData/{employee}",
 method = RequestMethod.GET)
@ResponseBody
public ResponseEntity> getEmployeeDataFromCompany(
  @MatrixVariable(pathVar = "employee") Map matrixVars) {
  ...
}

7. Reliure partielle

Outre la simplicité, la flexibilité est un autre avantage, mais les variables matricielles peuvent être utilisées de différentes manières. Par exemple, nous pouvons obtenir chaque variable de chaque segment de chemin. Considérez la demande suivante:

http://localhost:8080/spring-mvc-java/
  companyData/id=2;name=Xpto/employeeData/id=1;name=John;
  contactNumber=2200112334

Si nous voulons seulement connaître la variable matriciellename du segmentcompanyData, nous devons utiliser comme paramètre d'entrée ce qui suit:

@MatrixVariable(value="name", pathVar="company") String name

8. Conclusion

Cet article illustre certaines des différentes manières dont les variables de matrice peuvent être utilisées.

Il est essentiel de comprendre comment ce nouvel outil peut traiter des demandes trop complexes ou nous aider à ajouter plus de paramètres pour délimiter notre recherche.

L'implémentation de tous ces exemples et extraits de code peut être trouvée dans unGitHub project - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.