Ich habe einen Controller, der RESTful Zugriff auf Informationen bietet:
@RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}")
public ModelAndView getBlah(@PathVariable String blahName, HttpServletRequest request,
HttpServletResponse response) {
Das Problem, das ich habe, ist, dass wenn ich den Server mit einer Pfadvariablen mit Sonderzeichen treffe, dieser abgeschnitten wird. Zum Beispiel: http: // localhost: 8080 / blah-server / blah / get / blah2010.08.19-02: 25: 47
Der Parameter blahName lautet blah2010.08
Der Aufruf von request.getRequestURI () enthält jedoch alle übergebenen Informationen.
Haben Sie eine Idee, wie Sie verhindern können, dass Spring die @PathVariable abschneidet?
Antworten:
Versuchen Sie einen regulären Ausdruck für das
@RequestMapping
Argument:quelle
Dies hängt wahrscheinlich eng mit SPR-6164 zusammen . Kurz gesagt, das Framework versucht, einige Smarts auf die URI-Interpretation anzuwenden, indem es entfernt, was es für Dateierweiterungen hält. Dies hätte den Effekt des Drehens
blah2010.08.19-02:25:47
inblah2010.08
, da es das denkt ,.19-02:25:47
ist eine Dateierweiterung.Wie im verknüpften Problem beschrieben, können Sie dieses Verhalten deaktivieren, indem Sie Ihre eigene
DefaultAnnotationHandlerMapping
Bean im App-Kontext deklarieren und ihreuseDefaultSuffixPattern
Eigenschaft auf festlegenfalse
. Dadurch wird das Standardverhalten außer Kraft gesetzt und Ihre Daten werden nicht mehr belästigt.quelle
RequestMappingHandlerMapping
verwenden, lautet die festzulegende EigenschaftuseSuffixPatternMatch
(auch auffalse
). @Ted: Das verknüpfte Problem erwähnt, dass sie in 3.2 hoffen, ein bisschen mehr Kontrolle hinzuzufügen, damit es nicht alles oder nichts sein muss.WebMvcConfigurationSupport
die einen einfachen Hook bietet:public void configurePathMatch(PathMatchConfigurer configurer)
- Überschreiben Sie diese einfach und richten Sie den Pfad so ein, wie Sie möchten.Spring ist der Ansicht, dass alles, was hinter dem letzten Punkt steht, eine Dateierweiterung wie
.json
oder ist,.xml
und schneidet sie ab, um Ihren Parameter abzurufen.Also, wenn Sie haben
/{blahName}
:/param
,/param.json
,/param.xml
Oder/param.anything
wird in einem param mit Wert führenparam
/param.value.json
,/param.value.xml
oder/param.value.anything
führt zu einem Parameter mit Wertparam.value
Wenn Sie Ihre Zuordnung
/{blahName:.+}
wie vorgeschlagen ändern , wird jeder Punkt, einschließlich des letzten, als Teil Ihres Parameters betrachtet:/param
führt zu einem Parameter mit Wertparam
/param.json
führt zu einem Parameter mit Wertparam.json
/param.xml
führt zu einem Parameter mit Wertparam.xml
/param.anything
führt zu einem Parameter mit Wertparam.anything
/param.value.json
führt zu einem Parameter mit Wertparam.value.json
Wenn Sie die Erweiterungserkennung nicht interessieren, können Sie sie deaktivieren, indem Sie
mvc:annotation-driven
automagic überschreiben :Also noch einmal, wenn Sie haben
/{blahName}
:/param
,/param.json
,/param.xml
Oder/param.anything
wird in einem param mit Wert führenparam
/param.value.json
,/param.value.xml
oder/param.value.anything
führt zu einem Parameter mit Wertparam.value
Hinweis: Der Unterschied zur Standardkonfiguration ist nur sichtbar, wenn Sie eine Zuordnung wie haben
/something.{blahName}
. Siehe Resthub-Projektproblem .Wenn Sie die Erweiterungsverwaltung beibehalten möchten, können Sie seit Spring 3.2 auch die useRegisteredSuffixPatternMatch-Eigenschaft der RequestMappingHandlerMapping-Bean festlegen, um die SuffixPattern-Erkennung aktiviert, aber auf die registrierte Erweiterung beschränkt zu halten.
Hier definieren Sie nur JSON- und XML-Erweiterungen:
Beachten Sie, dass mvc: annotation-powered jetzt eine contentNegotiation-Option zum Bereitstellen einer benutzerdefinierten Bean akzeptiert, die Eigenschaft von RequestMappingHandlerMapping jedoch in true geändert werden muss (Standardwert false) (vgl. Https://jira.springsource.org/browse/SPR-7632) ).
Aus diesem Grund müssen Sie immer noch die gesamte mvc: annotation-gesteuerte Konfiguration überschreiben. Ich habe ein Ticket für Spring geöffnet, um nach einem benutzerdefinierten RequestMappingHandlerMapping zu fragen: https://jira.springsource.org/browse/SPR-11253 . Bitte stimmen Sie ab, wenn Sie interessiert sind.
Berücksichtigen Sie beim Überschreiben auch das Überschreiben der benutzerdefinierten Ausführungsverwaltung. Andernfalls schlagen alle Ihre benutzerdefinierten Ausnahmezuordnungen fehl. Sie müssen messageCoverters mit einer List Bean wiederverwenden:
Ich habe in dem Open-Source-Projekt Resthub , an dem ich beteiligt bin, eine Reihe von Tests zu diesen Themen implementiert: siehe https://github.com/resthub/resthub-spring-stack/pull/219/files und https: // github.com/resthub/resthub-spring-stack/issues/217
quelle
Alles nach dem letzten Punkt wird als Dateierweiterung interpretiert und standardmäßig abgeschnitten.
In Ihrer Feder Config xml können Sie hinzufügen
DefaultAnnotationHandlerMapping
und SatzuseDefaultSuffixPattern
auffalse
(Standardtrue
).Öffnen Sie also Ihre Spring-XML
mvc-config.xml
(oder wie auch immer sie heißt) und fügen Sie sie hinzuJetzt sollte Ihr
@PathVariable
blahName
(und auch alle anderen) den vollständigen Namen einschließlich aller Punkte enthalten.EDIT: Hier ist ein Link zur Spring API
quelle
<mvc:annotation-driven />
dann gegebenenfalls auch entfernen .Ich bin auch auf das gleiche Problem gestoßen, und das Setzen der Eigenschaft auf false hat mir auch nicht geholfen. Die API sagt jedoch :
Ich habe versucht, meiner RESTful-URL "/ end" hinzuzufügen, und das Problem ist behoben. Ich bin mit der Lösung nicht zufrieden, aber es hat funktioniert.
Übrigens weiß ich nicht, was die Spring-Designer gedacht haben, als sie diese "Funktion" hinzugefügt und dann standardmäßig aktiviert haben. IMHO sollte es entfernt werden.
quelle
Verwenden der richtigen Java-Konfigurationsklasse:
quelle
Ich habe durch diesen Hack gelöst
1) HttpServletRequest in @PathVariable wie unten hinzugefügt
2) Holen Sie sich die URL direkt (auf dieser Ebene keine Kürzung) in die Anfrage
Spring MVC @PathVariable mit Punkt (.) Wird abgeschnitten
quelle
Ich bin gerade darauf gestoßen und die Lösungen hier funktionierten im Allgemeinen nicht wie erwartet.
Ich schlage vor, einen SpEL-Ausdruck und mehrere Zuordnungen zu verwenden, z
quelle
Das Dateierweiterungsproblem besteht nur, wenn sich der Parameter im letzten Teil der URL befindet. Veränderung
zu
und alles wird wieder gut
quelle
Wenn Sie die Adresse bearbeiten können, an die Anforderungen gesendet werden, besteht eine einfache Lösung darin, ihnen einen abschließenden Schrägstrich (und auch den
@RequestMapping
Wert) hinzuzufügen :Das Mapping würde also so aussehen:
Siehe auch Spring MVC @PathVariable mit Punkt (.) Wird abgeschnitten .
quelle
quelle
Das Hinzufügen des ":. +" funktionierte für mich, aber erst, als ich die äußeren geschweiften Klammern entfernte.
value = {"/username/{id:.+}"}
hat nicht funktioniertvalue = "/username/{id:.+}"
funktioniertHoffe ich habe jemandem geholfen:]
quelle
Java-basierte Konfigurationslösung zum Verhindern des Abschneidens (unter Verwendung einer nicht veralteten Klasse):
Quelle: http://www.javacodegeeks.com/2013/01/spring-mvc-customizing-requestmappinghandlermapping.html
AKTUALISIEREN:
Ich habe festgestellt, dass einige Probleme mit der automatischen Konfiguration von Spring Boot aufgetreten sind, als ich den oben beschriebenen Ansatz verwendet habe (einige automatische Konfigurationen werden nicht wirksam).
Stattdessen begann ich, den
BeanPostProcessor
Ansatz zu verwenden. Es schien besser zu funktionieren.Inspiriert von: http://ronaldxq.blogspot.com/2014/10/spring-mvc-setting-alwaysusefullpath-on.html
quelle
Wenn Sie sicher sind, dass Ihr Text keiner der Standarderweiterungen entspricht, können Sie den folgenden Code verwenden:
quelle
Meine bevorzugte Lösung, um zu verhindern, dass Spring MVC @PathVariable abgeschnitten wird, besteht darin, am Ende der Pfadvariablen einen abschließenden Schrägstrich hinzuzufügen.
Beispielsweise:
Die Anfrage sieht also folgendermaßen aus:
quelle
Das Problem, mit dem Sie konfrontiert sind, ist darauf zurückzuführen, dass Spring den letzten Teil des Uri nach dem Punkt (.) Als Dateierweiterung wie .json oder .xml interpretiert. Wenn spring also versucht, die Pfadvariable aufzulösen, schneidet er einfach den Rest der Daten ab, nachdem er auf einen Punkt (.) Am Ende des Uri gestoßen ist. Hinweis: Dies geschieht auch nur, wenn Sie die Pfadvariable am Ende der URL beibehalten.
Betrachten Sie beispielsweise uri: https: //localhost/example/gallery.df/link.ar
In der obigen URL firstValue = "gallery.df" und secondValue = "link" das letzte Bit nach dem. wird abgeschnitten, wenn die Pfadvariable interpretiert wird.
Um dies zu verhindern, gibt es zwei Möglichkeiten:
1.) Verwenden eines regulären Ausdrucks
Verwenden Sie am Ende der Zuordnung einen regulären Ausdruck
Mit + geben wir an, dass jeder Wert, nachdem der Punkt ebenfalls Teil der Pfadvariablen ist.
2.) Hinzufügen eines Schrägstrichs am Ende unserer @PathVariable
Dies schließt unsere zweite Variable ein, die sie vor dem Standardverhalten von Spring schützt.
3) Durch Überschreiben der Standard-Webmvc-Konfiguration von Spring
Spring bietet Möglichkeiten zum Überschreiben der Standardkonfigurationen, die mithilfe der Anmerkungen @EnableWebMvc importiert werden. Wir können die Spring MVC-Konfiguration anpassen, indem wir unsere eigene DefaultAnnotationHandlerMapping- Bean im Anwendungskontext deklarieren und ihre useDefaultSuffixPattern- Eigenschaft auf false setzen. Beispiel:
Beachten Sie, dass das Überschreiben dieser Standardkonfiguration alle URLs betrifft.
Hinweis: Hier erweitern wir die WebMvcConfigurationSupport-Klasse, um die Standardmethoden zu überschreiben. Es gibt noch eine Möglichkeit, die deaktivierten Konfigurationen durch Implementieren der WebMvcConfigurer-Schnittstelle zu überschreiben. Weitere Informationen hierzu finden Sie unter: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/EnableWebMvc.html
quelle