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.
Sono quei due metodi nello stesso file .java? – sp00m
File separati. Domanda aggiornata per riflettere questo. – JasonStoltz
c'è un motivo per cui stai usando un percorso così avido per la tua mappatura? – dardo