Guide rapide des variables de matrice Spring MVC

1. Vue d'ensemble

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

La prise en charge des variables matricielles est devenue disponible dans Spring MVC 3.2 et vise à simplifier les requêtes avec un grand nombre de paramètres .

Dans cet article, nous montrerons comment nous pouvons 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 de matrice. Sur le même chemin, nous pouvons également répéter le même nom de variable ou séparer différentes valeurs en utilisant le caractère virgule (',').

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

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

ou comme ça:

//localhost:8080/spring-mvc-java-2 /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 classe Employee :

public class Employee { private long id; private String name; private String contactNumber; // standard setters and getters }

Et aussi la classe Entreprise :

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 des variables matricielles

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

//localhost:8080/spring-mvc-java-2/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 contact 223334411 .

5. Paramètre de complément

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

Par exemple, nous recherchons 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 doit être comme ceci:

//localhost:8080/spring-mvc-java-2/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 contact 22001 ou dont le nom est John .

6. Lier toutes les variables de matrice

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

//localhost:8080/spring-mvc-java-2/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 demande comme celle-ci:

//localhost:8080/spring-mvc-java-2/ 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, 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:

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

Si nous voulons uniquement connaître le nom de la variable de matrice du segment companyData , nous devons utiliser comme paramètre d'entrée ce qui suit:

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

8. Conclusion

Cet article a illustré certaines des différentes façons dont les variables matricielles 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 un projet GitHub - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.