Spring MVC @PathVariable mit Punkt (.) ist immer abgeschnitten
Dies ist die Fortsetzung von Frage
Spring MVC @PathVariable immer abgeschnitten
Frühjahr-forum heißt es, dass es behoben hat(version 3.2) als Teil der ContentNegotiationManager. siehe unten im link.
https://jira.springsource.org/browse/SPR-6164
https://jira.springsource.org/browse/SPR-7632
In meiner Anwendung requestParameter mit .com ist abgeschnitten.
Könnte jemand mir erklären, wie man diese neue Funktion? wie ist es konfigurierbare auf xml?
Hinweis: Frühlings-forum- #1
Spring MVC @PathVariable mit Punkt (.) ist immer abgeschnitten
InformationsquelleAutor Kanagavelu Sugumar | 2013-05-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Soweit ich weiß diese Frage wird nur angezeigt, für die pathvariable am Ende der requestmapping.
Waren wir in der Lage zu lösen, die durch die Definition des regex-addon in der requestmapping.
hier ist, wie ich das Problem gelöst, im Frühjahr 3.0.5
<!-- Spring Configuration needed to avoid URI using dots to be truncated --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="useDefaultSuffixPattern" value="false" /> </bean>
die syntax ist
{variable_name:regular_expression}
, hier haben wir also die variablevariable
, welcher Wert wird abgestimmt mit regex.+
(wo.
bedeutet "beliebiges Zeichen", und+
bedeutet "ein oder mehrere Male').wenn Sie
variable
in einer regelmäßigen Weise, Spring nutzt seine suffix-Erkennung features und schneidet alles nach dem Punkt. Wenn Sie regexp-Abgleich, werden diese features nicht verwendet variable wird nur abgestimmt werden, um regexp, die Sie bereitstellen.funktioniert nicht, wenn es mehr als einen Punkt in die variable. zB setzen E-Mails am Ende der ruhigen Pfade wie
/path/[email protected]
. Der controller gar nicht aufgerufen, aber es funktioniert, wenn es nur einen Punkt/path/[email protected]
. Jede Idee, warum und/oder einen workaround?InformationsquelleAutor Martin Frey
Frühjahr ist der Auffassung, dass alles, was hinter dem letzten Punkt ist eine Datei-Endung wie
.json
oder.xml
und trucate es zum abrufen Ihrer parameter.Also, wenn Sie
/somepath/{variable}
:/somepath/param
,/somepath/param.json
,/somepath/param.xml
oder/somepath/param.anything
wird in einem param mit dem Wertparam
/somepath/param.value.json
,/somepath/param.value.xml
oder/somepath/param.value.anything
wird in einem param mit dem Wertparam.value
wenn Sie ändern Ihre Zuordnung zu
/somepath/{variable:.+}
wie vorgeschlagen, jeden Punkt, einschließlich die Letzte sein wird, betrachten Sie als Teil Ihrer parameter :/somepath/param
wird in einem param mit dem Wertparam
/somepath/param.json
wird in einem param mit dem Wertparam.json
/somepath/param.xml
wird in einem param mit dem Wertparam.xml
/somepath/param.anything
wird in einem param mit dem Wertparam.anything
/somepath/param.value.json
wird in einem param mit dem Wertparam.value.json
Wenn Sie don ' T-care-extension-Erkennung, können Sie es deaktivieren, indem Sie das überschreiben
mvc:annotation-driven
automagic :Also, noch einmal, wenn Sie
/somepath/{variable}
:/somepath/param
,/somepath/param.json
,/somepath/param.xml
oder/somepath/param.anything
wird in einem param mit dem Wertparam
/somepath/param.value.json
,/somepath/param.value.xml
oder/somepath/param.value.anything
wird in einem param mit dem Wertparam.value
Hinweis : der Unterschied von der Standard-config ist nur sichtbar, wenn Sie eine Zuordnung wie
somepath/something.{variable}
. sehen Resthub Projekt Problemwenn Sie möchten, um die Erweiterung des Managements, da Spring 3.2 Sie können auch festlegen, dass die useRegisteredSuffixPatternMatch Eigenschaft von RequestMappingHandlerMapping bean in Ordnung zu halten suffixPattern Anerkennung freigeschaltet, aber nur registrierte Erweiterung.
Hier definieren Sie nur die json-und xml-Erweiterungen :
Beachten Sie, dass mvc:annotation-driven akzeptiert jetzt eine contentNegotiation option, um eine benutzerdefinierte Bohne, sondern die Eigenschaft der RequestMappingHandlerMapping muss geändert werden auf true (default false). (vgl. https://jira.springsource.org/browse/SPR-7632).
Aus diesem Grund, haben Sie immer noch überschreiben, die alle mvc:annotation-driven-configuration. Ich habe ein ticket eröffnet, bis zum Frühjahr zu Fragen, für eine benutzerdefinierte RequestMappingHandlerMapping : https://jira.springsource.org/browse/SPR-11253. Bitte abstimmen, wenn Sie intereted in.
Zwar überschreiben, werden carreful zu betrachten, auch eigene Execution-management überschreiben. Andernfalls werden alle Ihre benutzerdefinierten Ausnahme mappings schlägt fehl. Sie haben, um die Wiederverwendung messageCoverters mit einer Liste Bohne :
Ich umgesetzt, in der open-source-Projekt Resthub, dass ich ein Teil bin, eine Reihe von tests, die auf diese Themen : siehe https://github.com/resthub/resthub-spring-stack/pull/219/files & https://github.com/resthub/resthub-spring-stack/issues/217
Sie müssen definieren, diese Bohnen in Ihrem "standard" Frühling applicationContext.xml Datei(en). Dies gilt für Frühjahr 3.2 mindestens. Wahrscheinlich (zumindest teilweise) vor
Das ist die richtige Antwort meiner Meinung nach. Es scheint, dass der parameter "useRegisteredSuffixPatternMatch" eingeführt wurde genau für die OPs problem.
akzeptieren Sie diese Antwort
Das war nur die Hälfte der Lösung für mich. Siehe @Paul Aerer Antwort.
InformationsquelleAutor bmeurant
Update für den Frühling 4: seit 4.0.1 können Sie
PathMatchConfigurer
(über IhreWebMvcConfigurer
), z.B.In xml, es wäre (https://jira.spring.io/browse/SPR-10163):
Wo kommt die AllResources Klasse gehen?
Fügen Sie eine java-Klasse im gleichen Paket wie dein main.
Verwenden
matcher.setUseSuffixPatternMatch(false)
komplett zu deaktivieren suffix übereinstimmen.Das war nur die Hälfte der Lösung für mich. Siehe @Paul Aerer Antwort.
InformationsquelleAutor Dave Syer
Zusätzlich zu Martin Frey ' s Antwort, dies kann auch befestigt werden, indem ein trailing slash in die RequestMapping-Wert:
Beachten Sie, dass dieses Update unterstützt nicht die Wartbarkeit. Es erfordert nun alle URI ' s haben einen trailing-slash - etwas, das nicht offensichtlich sein-API-Benutzer /Entwickler. Weil es wahrscheinlich nicht alle Parameter
.
in Ihnen, es kann auch intermittierende Fehler+1 für dich. Dies funktioniert bei mir auch
aber es kollidiert mit AngularJS Standardverhalten zu entfernen Schrägstriche automatisch. Konfiguriert werden können in den letzten Winkel-Versionen, aber es ist etwas zu verfolgen, für Stunden, wenn Sie nicht wissen, was Los ist.
Und Sie gerade gespeichert haben mir Stunden Debuggen, danke! Trotzdem sollte man erwähnen, in der Antwort, dass der trailing slash wird, Bedarf es in der HTPP-Anfragen.
Das ist sehr gefährlich! Ich sicherlich würde nicht empfehlen es als eine Implementierung der API würde es am wenigsten erwarten. Nicht sehr wartungsfreundlich.
InformationsquelleAutor Michał Rybak
hinzufügen ":.+" arbeitete für mich, aber nicht, bis ich entfernt, die äußeren geschweiften Klammern.
Wert = {"/Benutzername/{id:.+}"} hat nicht funktioniert
value = "/Benutzername/{id:.+}" funktioniert
Hoffe, dass ich jemandem geholfen 🙂
id
InformationsquelleAutor Martin Čejka
In Spring Boot Rest-Controller, ich habe beschlossen diese, indem Sie die folgenden Schritte aus:
RestController :
Und Vom Rest-Client:
funktioniert wie ein Charme (auch ohne abschließenden slash). danke!!!
InformationsquelleAutor GoutamS
/somepath/{variable:.+}
funktioniert in JavarequestMapping
tag.Funktioniert nicht für E-Mail-Adressen mit mehr als einem Punkt.
Sth wie
"/{code:.+}"
funktioniert bei vielen Punkten nicht einer also61.12.7
es funktioniert auch für z.B.[email protected]
InformationsquelleAutor amit dahiya
Hier ist ein Ansatz, stützt sich rein auf java-Konfiguration:
InformationsquelleAutor Bruno Carrier
Einen ziemlich einfachen Weg um dieses Problem zu umgehen ist für das Anhängen eines trailing-slash ...
z.B.:
verwenden :
statt:
InformationsquelleAutor Marcelo C.
In den Frühling Starten, ist Der Reguläre Ausdruck, der das problem lösen, wie
Sth wie
"/{code:.+}"
funktioniert bei vielen Punkten nicht einer also61.12.7
es funktioniert auch für z.B.[email protected]
Ich habe es getestet mit der IP-Adresse. Es arbeitet sehr gut. Also, das heißt, es funktioniert für mehrere Punkte.
InformationsquelleAutor Dan
Die komplette Lösung, einschließlich E-Mail-Adressen in den Pfad-und Dateinamen für das Frühjahr 4.2 ist
Fügen Sie diese auf der Anwendungs-xml -
InformationsquelleAutor Paul Arer
Wenn du mit Spring 3.2.x und
<mvc:annotation-driven />
erstellen Sie dieses kleineBeanPostProcessor
:Dann setzen Sie diese in Ihrem MVC config xml:
Mein code konfiguriert nur die RequestMappingHandlerMapping so, dass die URLs werden nicht gekürzt. ContentNegotiationManager ist ein anderes Tier.
Das ist alt, aber Sie wirklich nicht brauchen ein
BeanPostProcessor
. Wenn SieWebMvcConfigurationSupport
können Sie überschreiben dierequestMappingHandlerMapping
@Bean
Methode. Wenn Sie XML-config-Datei, können Sie einfach erklären, Ihre eigenenRequestMappingHandlerMapping
bean und erklären, dass Eigentum.Vielen Dank, ich habe versucht, eine unterschiedliche Anzahl von Lösungen für das gleiche problem, nur diese funktionierte für mich. 🙂
InformationsquelleAutor Jukka
Schließlich fand ich die Lösung in Frühjahr Docs:
Hinzufügen dieser zu meinem
WebMvcConfigurerAdapter
Umsetzung das problem gelöst:InformationsquelleAutor luboskrnac
Für mich die
funktioniert aber nur, wenn du auch codieren den "Punkt" in Ihrer Anfrage-url als "%2E", dann funktioniert es. Erfordert aber die URL ' s alle,...die nicht ein "standard" - Codierung, obwohl gültig. Fühlt sich an wie etwas von einen bug 😐
Den anderen umgehen, ähnlich der "trailing slash" Weg ist, verschieben Sie die variable, wird der Punkt "inline" ex:
@GetMapping(path = "/{variableName}/a")
nun alle Punkte bleiben erhalten, keine änderungen oder regex benötigt.
InformationsquelleAutor rogerdpack