Eine Kurzanleitung zu Spring-MVC-Matrixvariablen

Eine Kurzanleitung für Spring MVC Matrix-Variablen

1. Überblick

Die URI-SpezifikationRFC 3986definiert URI-Pfadparameter als Name-Wert-Paare. 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 sollsimplify requests with a large number of parameters betragen.

In diesem Artikel wird gezeigt, wie komplexe GET-Anforderungen vereinfacht werden können, bei denen variable oder optionale Pfadparameter in den verschiedenen Pfadsegmenten eines URI verwendet werden.

2. Aufbau

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 einem beliebigen Teil des Pfads vorkommen. Das Gleichheitszeichen ("=") wird zur Angabe von Werten verwendet, und das Semikolon (";") zur Begrenzung jeder Matrixvariablen. Auf demselben Pfad können wir auch den gleichen 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:

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

oder so:

http://localhost:8080/spring-mvc-java
  /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 KlasseEmployee:

public class Employee {

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

    // standard setters and getters
}

Und auch die KlasseCompany:

public class Company {

    private long id;
    private String name;

    // standard setters and getters
}

Diese beiden Klassen binden die Anforderungsparameter.

4. Eigenschaften von Matrixvariablen definieren

Wir können erforderliche oder Standardeigenschaften für die Variable angeben. Im folgenden Beispiel istcontactNumber erforderlich, daher muss es in unseren Pfad aufgenommen werden, ungefähr so:

http://localhost:8080/spring-mvc-java/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 Kontaktnummer223334411 haben.

5. Komplement-Parameter

Matrixvariablen können Pfadvariablen ergänzen.

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

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

http://localhost:8080/spring-mvc-java/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 Kontaktnummer22001 haben oder deren NameJohn ist.

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 anMap binden:

http://localhost:8080/spring-mvc-java/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 auf die Matrixvariablen eines bestimmten Teils des Pfades beschränken. Zum Beispiel, wenn wir eine Anfrage wie diese haben:

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

Und wir wollen nur alle Variablen erhalten, die zuemployeeData 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 die Flexibilität ein weiterer Vorteil. Matrixvariablen können auf verschiedene Arten verwendet werden. Beispielsweise können wir jede Variable aus jedem Pfadsegment abrufen. Betrachten Sie die folgende Anfrage:

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

Wenn wir nur die Matrixvariablename descompanyData-Segments kennen wollen, sollten wir als Eingabeparameter Folgendes verwenden:

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

8. Fazit

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

Es ist wichtig zu verstehen, wie dieses neue Tool mit zu komplexen Anforderungen umgehen kann oder wie wir weitere Parameter hinzufügen können, um unsere Suche einzugrenzen.

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