Spring MVC @PathVariable mit einem Punkt (.) Wird abgeschnitten

Spring MVC @PathVariable mit einem Punkt (.) Wird abgeschnitten

1. Überblick

In diesem kurzen Tutorial werden wir ein häufiges Problem bei der Arbeit mit Spring MVC -when using a Spring @PathVariable with a @RequestMapping to map the end of a request URI that contains a dot, we’ll end up with a partial value in our variable, truncated at the last dot. diskutieren

In den nächsten Abschnitten werden wir uns darauf konzentrieren, warum dies geschieht und wie dieses Verhalten geändert werden kann.

Eine Einführung in Spring MVC finden Sie unterto this article.

2. Unerwünschte Frühlingshilfe

Das Framework verursacht dieses häufig unerwünschte Verhalten aufgrund der Art und Weise, wie es die Pfadvariable interpretiert.

InsbesondereSpring considers that anything behind the last dot is a file extension wie.json oder.xml.

Infolgedessen wird der Wert gekürzt, um den Parameter abzurufen.

Sehen wir uns ein Beispiel für die Verwendung von Pfadvariablen an und analysieren das Ergebnis mit verschiedenen möglichen Werten:

@RestController
public class CustomController {
    @GetMapping("/example/{firstValue}/{secondValue}")
    public void example(@PathVariable("firstValue") String firstValue,
      @PathVariable("secondValue") String secondValue) {
        // ...
    }
}

Betrachten wir im obigen Beispiel die nächsten Anforderungen und bewerten Sie unsere Variablen:

  • Die URLexample/gallery/linkführt zur Auswertung vonfirstValue = "Galerie" undsecondValue = "Link".

  • Wenn Sie die URL vonexample/gallery.df/link.arverwenden, haben wirfirstValue = "gallery.df" undsecondValue = "link".

  • Mit der URL vonexample/gallery.df/link.com.arlauten unsere Variablen:firstValue = "gallery.df" undsecondValue = "link.com"

Wie wir sehen können, ist die erste Variable nicht betroffen, die zweite wird jedoch immer abgeschnitten.

3. Lösungen

Eine Möglichkeit, diese Unannehmlichkeit zu lösen, besteht inmodify our @PathVariable definition by adding a regex mapping. Dabei wird jeder Punkt, einschließlich des letzten, als Teil unseres Parameters betrachtet:

@GetMapping("/example/{firstValue}/{secondValue:.+}")
public void example(
  @PathVariable("firstValue") String firstValue,
  @PathVariable("secondValue") String secondValue) {
    //...
}

Eine andere Möglichkeit, dieses Problem zu vermeiden, besteht inadding a slash at the end of our @PathVariable. Dies schließt unsere zweite Variable ein, die sie vor dem Standardverhalten von Spring schützt:

@GetMapping("/example/{firstValue}/{secondValue}/")

Die beiden oben genannten Lösungen gelten für eine einzelne Anforderungszuordnung, die wir ändern.

Wenn wir das Verhalten auf globaler MVC-Ebene ändern möchten, können wir die Spring MVC-Konfiguration anpassen, indem wir unsere eigeneDefaultAnnotationHandlerMapping-Bean im Anwendungskontext undsetting its useDefaultSuffixPattern property to false:  deklarieren

@Configuration
public class CustomWebConfiguration extends WebMvcConfigurationSupport {

    @Bean
    public RequestMappingHandlerMapping
      requestMappingHandlerMapping() {

        RequestMappingHandlerMapping handlerMapping
          = super.requestMappingHandlerMapping();
        handlerMapping.setUseSuffixPatternMatch(false);
        return handlerMapping;
    }
}

Wir müssen uns daran erinnern, dass dieser Ansatz alle URLs betrifft.

Mit diesen 3 Optionen erhalten wir das gleiche Ergebnis: Wenn Sie die Variableexample/gallery.df/link.com.ar URL,uursecondValueaufrufen, wird die Variable "link.com.ar" ausgewertet. , was wir wollen.

4. Fazit

In diesem kurzen Bericht haben wir verschiedene Möglichkeiten untersucht, um ein häufiges Problem bei der Arbeit mit@PathVariable und@RequestMapping in Spring MVC und der Ursache dieses Problems zu lösen.

Wie immer ist der vollständige Quellcode der Beispieleover on GitHub verfügbar.