Frühling - Path-variable abschneiden nach der dot - annotation
Ich versuche zum einrichten einer REST-Endpunkt, der für die Abfrage eines Benutzers, indem Sie Ihre E-Mail-Adresse. Die E-Mail-Adresse ist der Letzte Teil des Pfades, also der Frühling ist die Behandlung [email protected]
als der Wert foo@example
abschneiden und die Erweiterung .com
.
Fand ich eine ähnliche Frage hier Spring MVC @PathVariable mit Punkt (.) ist immer abgeschnitten
Allerdings habe ich eine annotation-basierte Konfiguration mit Hilfe AbstractAnnotationConfigDispatcherServletInitializer
und WebMvcConfigurerAdapter
. Da ich keine xml-Konfiguration, diese Lösung funktioniert nicht für mich:
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="useDefaultSuffixPattern" value="false" />
</bean>
Habe ich auch versucht, diese Lösung, die über regex, aber es hat nicht funktioniert entweder.
@RequestMapping(value = "user/by-email/{email:.+}")
Weiß jemand, wie man schalten Sie das suffix-Muster abschneiden ohne xml?
InformationsquelleAutor masstroy | 2014-12-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Punkt in der path-variable am Ende der URI bewirkt, dass zwei unerwarteten Verhaltensweisen (unerwartet für die Mehrheit der Benutzer, außer jenen, die vertraut mit der großen Anzahl von Frühling configuration properties).
Den ersten (die kann behoben werden, mit der
{email:.+}
regex) ist, dass die Standard-Spring-Konfiguration entspricht allen Pfad-Erweiterungen. So die Einrichtung eines mapping für/api/{file}
bedeutet, dass der Frühling maps ein Aufruf/api/myfile.html
dem String-argumentmyfile
. Dies ist nützlich, wenn Sie möchten/api/myfile.html
,/api/myfile.md
,/api/myfile.txt
und andere verweisen alle auf die gleiche Ressource. Aber wir können dieses Verhalten ausschalten Global ohne Rückgriff auf ein regex-hack auf jedem Endpunkt.Das zweite problem bezieht sich auf die erste und richtig Feste durch @masstroy. Wenn
/api/myfile.*
Punkte dermyfile
Ressource, Frühling setzt die Pfad-Erweiterung (.html
,.txt
usw.) zeigt an, dass die Ressource zurückgegeben werden sollen, die mit einem bestimmten format. Dieses Verhalten kann auch sehr nützlich sein in einigen Situationen. Oftmals ist es aber bedeuten, dass das Objekt zurückgegeben, indem eine mapping-Methode nicht in diese format konvertiert, und im Frühjahr werfen wirdHttpMediaTypeNotAcceptableException
.Können wir beide auszuschalten mit der folgenden (vorausgesetzt, Spring Boot):
Mehr über Content-Negotiation.
InformationsquelleAutor bkjvbx
Haben Sie auf add trailing slash am Ende der path-Variablen nach Namen wie
Die Anfrage wie
http://localhost:8080/utooa/service/api/admin/test/[email protected]/
InformationsquelleAutor takeoffjava
Habe ich die Lösung gefunden, um dies unter Verwendung der
ContentNegotiationConfigurer
bean aus diesem Artikel: http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvcHinzugefügt habe ich folgende Konfiguration auf meinem WebConfig-Klasse:
Durch Einstellung
.favorPathExtension(false)
wird der Frühling nicht mehr verwenden die Datei-Endung zu überschreiben, die akzeptiert mediaType der Anfrage. Die Javadoc für diese Methode liestIndicate whether the extension of the request path should be used to determine the requested media type with the highest priority.
Dann richte ich meine @RequestMapping regex
{email:.+}
hack Sie können auch deaktivieren suffix pattern-matching durch überschreibenWebMvcConfigurerAdapter.configurePathMatch(PathMatcherConfigurer configurer)
und Einstellungconfigurer.setUseSuffixPatternMatch(false)
. Sie können auch einschränken, suffix pattern-matching explizit registrierte Datei-Erweiterungen.{E-Mail:.+} bei mir funktioniert ohne zusätzliche Konfiguration. Das bedeutet, dass es nicht abschneiden, einen Teil nach dem Punkt. Aber es war ein anderes problem. ExceptionHandler hat nicht richtig funktioniert mit gepunkteten Variablen. Ihre Lösung beseitigt dieses problem auch
können Sie Ihre Lösung als Antwort, es sieht besser aus als dieses hier und ich werde markieren Sie es als Antwort akzeptiert
Getan.
InformationsquelleAutor masstroy
Für die Java-Config Leute:
Mit Feder 4 Sie können einfach diese Funktion deaktivieren, indem Sie:
Dann in der ganzen Anwendung, die Punkte werden behandelt, als Punkte.
InformationsquelleAutor d0x