2013-01-21 22 views
6

Ho 2 mappature del controller di primavera:Come si imposta la priorità sulla mappatura MVC primaverile?

@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) { 
    } 
} 

il seguente URL partite entrambe le mappature: /home.html

Tuttavia, voglio far sì che la mappatura 'contenuto' ha sempre la priorità sul ' home 'mapping. C'è un modo per specificarlo?

+1

Sono quei due metodi nello stesso file .java? – sp00m

+0

File separati. Domanda aggiornata per riflettere questo. – JasonStoltz

+0

c'è un motivo per cui stai usando un percorso così avido per la tua mappatura? – dardo

risposta

0

La mappatura degli URL è determinata dall'ordine in cui vengono rilevati i mapping.

Quindi è possibile forzare un controller da creare nel contesto di primavera dopo l'altro controller.

Questo può essere fatto utilizzando l'attributo depends-on = "" nella definizione del bean (in xml).

Non sono sicuro se utilizza la prima mappatura trovata o l'ultima.

Inoltre, questa è solo teoria, in realtà non l'ho provato.

vedo i messaggi di log in questo modo:

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' 

Quindi vale la pena avere un lok al SimpleUrlHandlerMapping per vedere come funziona.

+0

Dare uno scatto ... – JasonStoltz

+0

Ho provato questo e non sembra funzionare. Suppongo che abbia a che fare con la specificità dei mapping sebbene ... il significato di/home sia considerato più specifico di {content} .html, quindi viene valutato per primo. Un'intuizione in ogni caso modifica: http://stackoverflow.com/questions/2326912/ordered-requestmapping-in-spring-mvc – JasonStoltz

+2

Anche se funziona, non penso che avrà l'effetto desiderato. La primavera preferirà sempre la mappatura più specifica, credo. – JasonStoltz

-2

questo url (/home.html) non corrisponde sia mappature:

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

E 'appena partita la prima perché ha un suffisso ".html"!

+1

Corrisponde a entrambi. Suffix non sono richiesti in RequestMapping. – JasonStoltz

4

ho avuto problema molto simile di recente in cui ho dovuto due tipi di URL ambigue:

  • Uno è stato l'accettazione di un anno, dire /2012, /2013 ecc ho creato utilizzando l'associazione con l'espressione regolare come questo: @RequestMapping("/{year:(?:19|20)\\d{2}}")
  • Un altro stava accettando un identificatore di contenuto (aka slug). L'ho creato utilizzando la mappatura come @RequestMapping("/{slug}").

Era importante che il metodo del controllore "anno" avesse la precedenza su quello "slug". Sfortunatamente (per me) Spring usava sempre il metodo del controller "slug".

Come Spring MVC preferisce più specifici mappature, ho dovuto fare il mio modello "slug" meno specifici. Sulla base della documentazione Path Pattern Comparison, ho aggiunto wild card per la mappatura slug: @RequestMapping("/{slug}**")

miei controllori aspetto così e ora listByYear viene chiamato quando un anno (/2012, /1998 ecc) è in URL.

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

e

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

Questo non è esattamente come impostare una priorità (che a mio parere sarebbe una caratteristica sorprendente) ma indica una sorta di soluzione "bello" e potrebbe essere utile in il futuro.

Problemi correlati