Eine Kurzanleitung zu Spring MVC Matrix-Variablen

1. Übersicht

In der URI-Spezifikation RFC 3986 wurden URI-Pfadparameter als Name-Wert-Paare definiert. Matrixvariablen sind ein von Spring geprägter Begriff und eine alternative Implementierung zum Übergeben und Parsen von URI-Pfadparametern.

Die Unterstützung von Matrixvariablen wurde in Spring MVC 3.2 verfügbar und soll Anforderungen mit einer großen Anzahl von Parametern vereinfachen .

In diesem Artikel zeigen wir, wie wir komplexe GET-Anforderungen vereinfachen können, die entweder variable oder optionale Pfadparameter in den verschiedenen Pfadsegmenten eines URI verwenden.

2. Konfiguration

Beginnen wir mit der Konfiguration, um Spring MVC Matrix Variables zu aktivieren:

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

Andernfalls sind sie standardmäßig deaktiviert.

3. Verwendung von Matrixvariablen

Diese Variablen können in jedem Teil des Pfads erscheinen, und das Zeichen gleich ("=") wird zum Angeben von Werten und das Semikolon (';') zum Abgrenzen jeder Matrixvariablen verwendet. Auf demselben Pfad können wir auch denselben Variablennamen wiederholen oder verschiedene Werte durch das Komma (',') trennen.

In unserem Beispiel gibt es einen Controller, der Informationen zu den Mitarbeitern bereitstellt. Jeder Mitarbeiter hat einen Arbeitsbereich, und wir können nach diesem Attribut suchen. Die folgende Anfrage könnte für die Suche verwendet werden:

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

oder so:

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

Wenn wir in Spring MVC auf diese Variablen verweisen möchten, sollten wir die Annotation @MatrixVariable verwenden .

In unseren Beispielen verwenden wir die Employee- Klasse:

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

Und auch die Firmenklasse :

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

Diese beiden Klassen binden die Anforderungsparameter.

4. Definieren von Matrixvariableneigenschaften

Wir können erforderliche oder Standardeigenschaften für die Variable angeben. Im folgenden Beispiel ist die Kontaktnummer erforderlich, daher muss sie in unseren Pfad aufgenommen werden, etwa so:

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

Die Anfrage wird wie folgt bearbeitet:

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

Als Ergebnis erhalten wir alle Mitarbeiter, die die Kontaktnummer 223334411 haben .

5. Komplementparameter

Matrixvariablen können Pfadvariablen ergänzen.

Zum Beispiel suchen wir einen Mitarbeiter nach seinem Namen, können aber auch die Startnummern seiner Kontaktnummer angeben.

Die Anfrage für diese Suche sollte folgendermaßen aussehen:

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

Die Anfrage wird wie folgt bearbeitet:

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

Als Ergebnis erhalten wir alle Mitarbeiter, die die Kontaktnummer 22001 haben oder John heißen .

6. Alle Matrixvariablen binden

Wenn wir aus irgendeinem Grund alle Variablen abrufen möchten, die auf dem Pfad verfügbar sind, können wir sie an eine Map binden :

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

Diese Anfrage wird wie folgt bearbeitet:

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

Natürlich können wir die Bindung an die Matrixvariablen eines bestimmten Teils des Pfades beschränken. Zum Beispiel, wenn wir eine Anfrage wie diese haben:

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

Und wir möchten nur alle Variablen abrufen, die zu employeeData gehören . dann sollten wir als Eingabeparameter Folgendes verwenden:

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

7. Teilbindung

Neben der Einfachheit ist Flexibilität ein weiterer Vorteil. Matrixvariablen können auf verschiedene Arten verwendet werden. Zum Beispiel können wir jede Variable aus jedem Pfadsegment abrufen. Betrachten Sie die folgende Anfrage:

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

Wenn wir nur den Namen der Matrixvariablen des Segments companyData kennen möchten , sollten wir Folgendes als Eingabeparameter verwenden:

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

8. Fazit

Dieser Artikel veranschaulicht einige der verschiedenen Möglichkeiten, wie Matrixvariablen verwendet werden können.

Es ist wichtig zu verstehen, wie dieses neue Tool mit zu komplexen Anforderungen umgehen oder uns helfen kann, weitere Parameter hinzuzufügen, um unsere Suche einzugrenzen.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie in einem GitHub-Projekt - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.