2013-01-21 7 views
6

Ich habe 2 Feder-Controller-Mappings:Wie setze ich Priorität auf Spring MVC Mapping?

@Controller 
public class ContentController { 

    @RequestMapping(value = "**/{content}.html") 
    public String content(@PathVariable String content, Model model, HttpServletRequest request) { 
    } 
} 

@Controller 
public class HomeController { 

    @RequestMapping(value = "**/home") 
    public String home(HttpServletRequest request, Model model) { 
    } 
} 

Die folgende URL entspricht beide Zuordnungen: /home.html

Ich möchte jedoch, dass der 'Inhalt' Mapping Priorität hat immer über die gewährleisten ' Heimatkarte. Gibt es eine Möglichkeit, das zu spezifizieren?

+1

Sind diese beiden Methoden in der gleichen .java-Datei? – sp00m

+0

Separate Dateien. Aktualisierte Frage, um das zu reflektieren. – JasonStoltz

+0

Gibt es einen Grund, warum Sie einen so gierigen Pfad für Ihr Mapping verwenden? – dardo

Antwort

0

Die URL-Zuordnung hängt von der Reihenfolge ab, in der die Zuordnungen ermittelt werden.

So könnte man einen Controller im Federkontext nach dem anderen Controller erzwingen.

Dies kann mit dem Attribut depends-on = "" in der Bean-Definition (in XML) erfolgen.

Ich bin nicht sicher, ob es die erste Zuordnung verwendet, die es findet, oder die letzte.

Auch das ist nur Theorie, ich habe dies tatsächlich nicht versucht.

Ich sehe Protokollmeldungen wie folgt aus:

17:29:01.618 [main] INF S o.s.w.s.h.SimpleUrlHandlerMapping - Mapped URL path [/resources/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0' 
17:29:01.625 [main] INF S o.s.w.s.h.SimpleUrlHandlerMapping - Mapped URL path [/**] onto handler 'org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler#0' 

So lohnt sich ein lok bei SimpleUrlHandlerMapping mit, um zu sehen, wie es funktioniert.

+0

Dies ist eine Einstellung ... – JasonStoltz

+0

Ich habe das versucht und es schien nicht zu funktionieren. Ich nehme an, dass das mit der Spezifität der Zuordnungen zu tun hat, was bedeutet, dass/home als spezifischer betrachtet wird als {content} .html, so wird es zuerst ausgewertet. Ein hunch sowieso edit: http://stackoverflow.com/questions/2326912/ordered-requestmapping-in-spring-mvc – JasonStoltz

+2

Auch wenn das funktioniert, glaube ich nicht, dass es den gewünschten Effekt haben wird. Der Frühling wird immer das spezifischere Mapping bevorzugen, glaube ich. – JasonStoltz

-2

Diese URL (/home.html) passt nicht beide Zuordnungen:

@RequestMapping(value = "**/{content}.html") 
    ... 
    @RequestMapping(value = "**/home") 
    … 

Es passen nur die erste, weil es ein Suffix ".html" hat!

+1

Es passt beides. Suffixe sind in RequestMapping nicht erforderlich. – JasonStoltz

4

Ich hatte sehr ähnliches Problem vor kurzem, wo ich zwei Arten von mehrdeutiger URLs hatte:

  • Ein ein Jahr war die Annahme, sagen /2012, /2013 usw. Ich habe es mit regulärem Ausdruck wie folgt aus Mapping: @RequestMapping("/{year:(?:19|20)\\d{2}}")
  • Ein anderer akzeptierte eine Inhaltskennung (aka slug). Ich habe es unter Verwendung von Mapping wie @RequestMapping("/{slug}") erstellt.

Es war wichtig, dass die "Jahr" Controller-Methode Vorrang vor der "Slug" hatte. Leider (für mich) verwendete Spring immer die "Slug" Controller-Methode.

Wie Spring MVC bevorzugt spezifischere Mappings, musste ich meine "Slug" Muster weniger spezifisch machen. Basierend auf Path Pattern Comparison Dokumentation, fügte ich Wild Card in das Slug-Mapping: @RequestMapping("/{slug}**")

Meine Controller aussehen wie das und jetzt listByYear wird aufgerufen, wenn ein Jahr (/2012, /1998 usw.) in URL ist.

@Controller 
public class ContentController 
{ 
    @RequestMapping(value = "/{slug}**") 
    public String content(@PathVariable("slug") final String slug) 
    { 
     return "content"; 
    } 
} 

und

@Controller 
public class IndexController 
{ 
    @RequestMapping("/{year:(?:19|20)\\d{2}}") 
    public String listByYear() 
    { 
     return "list"; 
    } 
} 

Dies ist nicht genau, wie eine Priorität einzurichten (was meiner Meinung nach wäre eine erstaunliche Eigenschaft sein), aber eine Art von „nett“ Abhilfe geben und könnte sehr nützlich sein, in die Zukunft.

Verwandte Themen