Una guida rapida alle variabili matrice Spring MVC

1. Panoramica

La specifica URI RFC 3986 definisce i parametri del percorso URI come coppie nome-valore. Le variabili di matrice è un termine coniato da Spring e un'implementazione alternativa per il passaggio e l'analisi dei parametri del percorso URI.

Il supporto delle variabili di matrice è diventato disponibile in Spring MVC 3.2 e ha lo scopo di semplificare le richieste con un gran numero di parametri .

In questo articolo, mostreremo come possiamo semplificare richieste GET complesse che utilizzano parametri di percorso variabili o opzionali all'interno dei diversi segmenti di percorso di un URI.

2. Configurazione

Per abilitare le variabili matrice Spring MVC, iniziamo con la configurazione:

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

Altrimenti, sono disabilitati per impostazione predefinita.

3. Come utilizzare le variabili matrice

Queste variabili possono apparire in qualsiasi parte del percorso e il carattere uguale ("=") viene utilizzato per fornire i valori e il punto e virgola (';') per delimitare ciascuna variabile di matrice. Sullo stesso percorso, possiamo anche ripetere lo stesso nome di variabile o separare valori diversi utilizzando il carattere virgola (',').

Il nostro esempio ha un controller che fornisce informazioni sui dipendenti. Ogni dipendente ha un'area di lavoro e possiamo cercare in base a quell'attributo. La seguente richiesta potrebbe essere utilizzata per la ricerca:

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

o così:

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

Quando vogliamo fare riferimento a queste variabili in Spring MVC, dovremmo usare l'annotazione @MatrixVariable .

Nei nostri esempi, useremo la classe Employee :

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

E anche la classe Company :

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

Queste due classi legheranno i parametri della richiesta.

4. Definizione delle proprietà delle variabili di matrice

Possiamo specificare proprietà obbligatorie o predefinite per la variabile. Nell'esempio seguente, contactNumber è obbligatorio, quindi deve essere incluso nel nostro percorso, qualcosa del genere:

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

La richiesta verrà gestita con il seguente metodo:

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

Di conseguenza, otterremo tutti i dipendenti che hanno il numero di contatto 223334411 .

5. Parametro di complemento

Le variabili di matrice possono integrare le variabili di percorso.

Ad esempio, stiamo cercando un dipendente per il suo nome, ma possiamo anche includere i numeri iniziali del suo numero di contatto.

La richiesta per questa ricerca dovrebbe essere così:

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

La richiesta verrà gestita con il seguente metodo:

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

Di conseguenza, otterremo tutti i dipendenti che hanno il numero di contatto 22001 o il cui nome è John .

6. Associazione di tutte le variabili di matrice

If for some reason, we want to get all the variables that are available on the path, we can bind them to a Map:

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

This request will be handled by the following method:

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

Of course, we can restrict binding to the matrix variables of a specific part of the path. For example, if we have a request like this:

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

And we only want to get all the variables that belong to employeeData; then we should use as an input parameter this:

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

7. Partial Binding

Apart from simplicity, flexibility is another gain, matrix variables can be used in a variety of different ways. For example, we can get each variable from each path segment. Consider the following request:

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

Se vogliamo solo conoscere il nome della variabile di matrice del segmento companyData , allora, dovremmo usare come parametro di input quanto segue:

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

8. Conclusione

Questo articolo ha illustrato alcuni dei vari modi in cui è possibile utilizzare le variabili di matrice.

È fondamentale capire come questo nuovo strumento possa gestire richieste troppo complesse o aiutarci ad aggiungere più parametri per delimitare la nostra ricerca.

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata in un progetto GitHub: questo è un progetto basato su Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.