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.
Sind diese beiden Methoden in der gleichen .java-Datei? – sp00m
Separate Dateien. Aktualisierte Frage, um das zu reflektieren. – JasonStoltz
Gibt es einen Grund, warum Sie einen so gierigen Pfad für Ihr Mapping verwenden? – dardo