Dies ist die Fortsetzung der Frage ob Spring MVC @PathVariable abgeschnitten wird
Das Frühlingsforum gibt an, dass es als Teil von ContentNegotiationManager behoben wurde (Version 3.2). siehe den folgenden Link.
https://jira.springsource.org/browse/SPR-6164
https://jira.springsource.org/browse/SPR-7632
In meiner Anwendung wird requestParameter with .com abgeschnitten.
Kann mir jemand erklären, wie man diese neue Funktion benutzt? Wie ist es bei XML konfigurierbar?
Hinweis: Spring Forum - # 1 Spring MVC @PathVariable mit Punkt (.) Wird abgeschnitten
spring
rest
spring-mvc
spring-annotations
Kanagavelu Sugumar
quelle
quelle
<!-- 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>
{variable_name:regular_expression}
, also haben wir hier eine Variable namensvariable
, deren Wert mit Regex abgeglichen wird.+
(wobei.
"beliebiges Zeichen" und+
"einmal oder mehrmals" bedeutet).variable
regelmäßig übereinstimmen , verwendet Spring seine Suffix-Erkennungsfunktionen und schneidet alles nach Punkt ab. Wenn Sie den regulären Ausdruck verwenden, werden diese Funktionen nicht verwendet. Die Variable wird nur mit dem von Ihnen bereitgestellten regulären Ausdruck abgeglichen."variable:.+"
funktioniert nicht, wenn die Variable mehr als einen Punkt enthält. zB E-Mails am Ende von erholsamen Pfaden wie setzen/path/[email protected]
. Der Controller wird nicht einmal aufgerufen, funktioniert aber, wenn nur ein Punkt vorhanden ist/path/[email protected]
. Irgendeine Idee warum und / oder eine Problemumgehung?Spring ist der Ansicht, dass alles hinter dem letzten Punkt eine Dateierweiterung wie
.json
oder ist.xml
und trucate es, um Ihren Parameter abzurufen.Also, wenn Sie haben
/somepath/{variable}
:/somepath/param
,/somepath/param.json
,/somepath/param.xml
Oder/somepath/param.anything
wird in einem param mit Wert führenparam
/somepath/param.value.json
,/somepath/param.value.xml
oder/somepath/param.value.anything
führt zu einem Parameter mit Wertparam.value
Wenn Sie Ihre Zuordnung
/somepath/{variable:.+}
wie vorgeschlagen ändern , wird jeder Punkt, einschließlich des letzten, als Teil Ihres Parameters betrachtet:/somepath/param
führt zu einem Parameter mit Wertparam
/somepath/param.json
führt zu einem Parameter mit Wertparam.json
/somepath/param.xml
führt zu einem Parameter mit Wertparam.xml
/somepath/param.anything
führt zu einem Parameter mit Wertparam.anything
/somepath/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
/somepath/{variable}
:/somepath/param
,/somepath/param.json
,/somepath/param.xml
Oder/somepath/param.anything
wird in einem param mit Wert führenparam
/somepath/param.value.json
,/somepath/param.value.xml
oder/somepath/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
somepath/something.{variable}
. Siehe Problem mit dem Resthub-ProjektWenn 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 all 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.
Achten Sie beim Überschreiben darauf, auch das Überschreiben der benutzerdefinierten Ausführungsverwaltung zu berücksichtigen. 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 & https: // github.com/resthub/resthub-spring-stack/issues/217
quelle
Update für Spring 4: Seit 4.0.1 können Sie
PathMatchConfigurer
(über IhreWebMvcConfigurer
) zIn XML wäre es ( https://jira.spring.io/browse/SPR-10163 ):
quelle
matcher.setUseSuffixPatternMatch(false)
diese Option, um die Suffixübereinstimmung vollständig zu deaktivieren.Zusätzlich zu Martin Freys Antwort kann dies auch durch Hinzufügen eines abschließenden Schrägstrichs im RequestMapping-Wert behoben werden:
Beachten Sie, dass dieses Update die Wartbarkeit nicht unterstützt. Jetzt müssen alle URIs einen abschließenden Schrägstrich haben - etwas, das für API-Benutzer / neue Entwickler möglicherweise nicht ersichtlich ist. Da wahrscheinlich nicht alle Parameter ein enthalten
.
, kann es auch zu zeitweiligen Fehlern kommenquelle
In Spring Boot Rest Controller habe ich diese durch die folgenden Schritte behoben:
RestController:
Und vom Rest Client:
quelle
Das Hinzufügen des ":. +" funktionierte für mich, aber erst, als ich die äußeren geschweiften Klammern entfernte.
value = { "/username/{id:.+}" } hat nicht funktioniert
value = "/username/{id:.+}" funktioniert
Hoffe ich habe jemandem geholfen :)
quelle
id
/somepath/{variable:.+}
funktioniert in Java-requestMapping
Tag.quelle
"/{code:.+}"
funktioniert für viele Punkte nicht einer, dh61.12.7
es funktioniert auch für dh[email protected]
Hier ist ein Ansatz, der sich ausschließlich auf die Java-Konfiguration stützt:
quelle
Eine ziemlich einfache Möglichkeit, dieses Problem zu umgehen, besteht darin, einen abschließenden Schrägstrich anzuhängen ...
z.B:
verwenden :
anstatt:
quelle
In Spring Boot löst der reguläre Ausdruck das Problem wie folgt
quelle
"/{code:.+}"
funktioniert für viele Punkte nicht einer, dh61.12.7
es funktioniert auch für dh[email protected]
Die vollständige Lösung mit E-Mail-Adressen in Pfadnamen für Frühjahr 4.2 lautet
Fügen Sie dies der Anwendungs-XML hinzu
quelle
Wenn Sie Spring 3.2.x und verwenden
<mvc:annotation-driven />
, erstellen Sie FolgendesBeanPostProcessor
:Fügen Sie dies dann in Ihre MVC-Konfigurations-XML ein:
quelle
BeanPostProcessor
. Wenn Sie verwendenWebMvcConfigurationSupport
, können Sie dierequestMappingHandlerMapping
@Bean
Methode überschreiben . Wenn Sie die XML-Konfiguration verwenden, können Sie einfach Ihre eigeneRequestMappingHandlerMapping
Bean deklarieren und diese Eigenschaft deklarieren.Endlich habe ich in Spring Docs eine Lösung gefunden :
Das Hinzufügen zu meiner
WebMvcConfigurerAdapter
Implementierung löste das Problem:quelle
Für mich die
funktioniert aber nur, wenn Sie auch den "Punkt" in Ihrer Anforderungs-URL als "% 2E" codieren, dann funktioniert es. Es müssen jedoch alle URLs so sein, dass ... was keine "Standard" -Codierung ist, obwohl sie gültig ist. Fühlt sich wie ein Bug an: |
Die andere Problemumgehung, ähnlich wie beim "abschließenden Schrägstrich", besteht darin, die Variable zu verschieben, die den Punkt "inline" hat, z.
@GetMapping (path = "/ {variableName} / a")
Jetzt bleiben alle Punkte erhalten, es sind keine Änderungen oder Regex erforderlich.
quelle
Ab Spring 5.2.4 (Spring Boot v2.2.6.RELEASE)
PathMatchConfigurer.setUseSuffixPatternMatch
undContentNegotiationConfigurer.favorPathExtension
veraltet ( https://spring.io/blog/2020/03/24/spring-framework-5-2-5-available-now and https://github.com/spring-projects/spring-framework/issues/24179 ).Das eigentliche Problem besteht darin, dass der Client einen bestimmten Medientyp (z. B. .com) anfordert und Spring standardmäßig alle diese Medientypen hinzufügt. In den meisten Fällen erzeugt Ihr REST-Controller nur JSON, sodass das angeforderte Ausgabeformat (.com) nicht unterstützt wird. Um dieses Problem zu lösen, sollten Sie alle gut sein, indem Sie Ihren Rest-Controller (oder eine bestimmte Methode) aktualisieren, um das 'ouput'-Format (
@RequestMapping(produces = MediaType.ALL_VALUE
) zu unterstützen) und natürlich Zeichen wie einen Punkt zulassen ({username:.+}
) .Beispiel:
Spring 5.3 und höher stimmt nur mit registrierten Suffixen (Medientypen) überein.
quelle