Versuchen erstellen von REST-ful-URLs mit mehreren Punkten in der "Dateiname" Teil - Spring MVC 3.0
Ich bin mit Spring MVC (3.0) mit annotation-driven Controller. Ich würde gern erstellen von REST-ful-URLs für Ressourcen und in der Lage sein, um nicht erfordern (aber immer noch Optional zulassen) - Datei-Erweiterung am Ende der URL (aber davon ausgehen, HTML-content-Typ, wenn keine extension). Das funktioniert out-of-the-box mit Spring MVC, solange gibt es keine Punkte (Zeit/full-stop) in den Dateinamen-Teil.
Jedoch einige meiner URLs erfordern ein Bezeichner mit Punkten im Namen an. E. g. wie diese:
http://company.com/widgets/123.456.789.500
In diesem Fall Frühling sieht für eine content-Typ für die Erweiterung .500
und keine findet so Fehler. Ich kann verwenden Sie Tricks wie das hinzufügen .html
zu Ende, Kodierung der Bezeichner oder das hinzufügen einer abschließenden Schrägstrich. Glücklich bin ich nicht mit jeder, wenn diese aber konnte wohl Leben hinzufügen .html
.
Habe ich erfolglos nach einer Möglichkeit gesucht, überschreiben die Standard-Datei-extension-Erkennung im Frühjahr.
Ist es möglich, anpassen oder deaktivieren Sie die Datei-extension-Erkennung für einen bestimmten controller-Methode oder URL-Muster, etc?
InformationsquelleAutor der Frage nickdos | 2010-01-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
@PathVariable
pattern-matching ist ein bisschen nervös, wenn es um Punkte in der URL (siehe SPR-5778). Sie können machen es weniger nervös (aber mehr wählerisch), und bekommen eine bessere Kontrolle über die dot-heavy-URLs, durch die Einstellung deruseDefaultSuffixPattern
Eigenschaft aufDefaultAnnotationHandlerMapping
zufalse
.Wenn Sie nicht bereits ausdrücklich erklärt
DefaultAnnotationHandlerMapping
in Ihrem Kontext (und die meisten Menschen nicht, da es implizit deklariert für Sie), dann Sie können fügen Sie es explizit, und setzen Sie die Eigenschaft.InformationsquelleAutor der Antwort skaffman
Wohl, es ist ein hässlicher hack, ich wollte mich nur erkunden Erweiterbarkeit von Spring @MVC. Hier ist eine angepasste
PathMatcher
. Es nutzt$
im Muster als Ende-Markierung - wenn das Muster endet mit es, der marker wird entfernt und das Muster wird ergänzt durch die Standard-matcher, aber wenn ein Muster hat$
in der Mitte (z.B....$.*
), ein solches Muster ist nicht aufeinander abgestimmt sind.Config:
Und Nutzung ("/Hallo/1.2.3",
value
ist "1.2.3"):EDIT:: Jetzt nicht brechen "trailing slash spielt keine Rolle" - Regel
InformationsquelleAutor der Antwort axtavt
@Controller
public class MyController {
@RequestMapping(value="/widgets/{preDot}.{postDot}")
public void getResource(@PathVariable String preDot, @PathVariable String postDot) {
String fullPath = preDot + "." + postDot;
//...
}
}
//Obige code sollte passen /widgets/111.222.333.444
InformationsquelleAutor der Antwort
Frühjahr 3.2 geändert hat, und schlägt vor, dass Sie Eigenschaften für die
RequestMappingHandlerMapping
bean, entweder explizit (wenn nicht der Einsatz des mvc-namespace) oder mit einem BeanPostProcessor wie die folgenden (Sie müssen den scan-oder instanziieren):Können Sie auch einfach Anhängen
:.*
Ihrem @RequestMapping, z.B."/{documentPath:.*}"
(siehe JIRA-Kommentar)InformationsquelleAutor der Antwort paulcm
Ich das gleiche problem hatte ich auch und löste es, indem benutzerdefinierte PathMatcher. Meine Lösung ist etwas einfacher, was axtavt vorgeschlagen. Meine PathMatcher hat auch eine private final AntPathMatcher Ziel, und er delegiert alle Aufrufe an es unverändert, außer für die match () - Methode:
Dies funktioniert, weil der Frühling versucht, auf Controller durch hinzufügen von "." an das Ende. Zum Beispiel mit path mapping "/widgets/{id}" und die URL "/widgets/1.2.3.4", Feder versucht, das erste match gegen "/widgets/{id}." und danach "/widgets/{id}". Das erste match, aber es bleibt nur "1.2.3" für die id.
Meine PatchMatcher weist ausdrücklich Muster mit der Endung ".*", so der erste Versuch schlägt fehl, und die zweite entspricht.
Wenn Sie ContentNegotiatingViewResolver können Sie noch angeben, content-Typ in der URL mit request-parameter "format" (wenn die favorParameter auf true gesetzt ist).
-jarppe
InformationsquelleAutor der Antwort Jarppe
JFY: im Frühjahr 4 dieses Problem wird behoben, über: WebMvcConfigurerAdapter.
Oder über WebMvcConfigurationSupport wie hier.
InformationsquelleAutor der Antwort pls
Hinzufügen skaffman Antwort, wenn Sie mit
<mvc:annotation-driven/>
und Sie überschreiben möchten useDefaultSuffixPattern Wert, können Sie ersetzen die<mvc:annotation-driven>
tag mit dem folgenden:InformationsquelleAutor der Antwort Templar