Сопоставьте "Остальную часть URL-адреса" с помощью Spring 3 RequestMapping Annotation
Возможный дубликат:
Spring 3 RequestMapping: получить значение пути
В Spring 3, есть способ захватить rest/of/the/url
в следующем URL-адресе:
/myapp/foo/bar/rest/of/the/url
используя аннотацию @RequestMapping следующим образом:
@RequestMapping(value="{appname}/{path1}/{path2}/{remainder}")
public String myRequestMethod(
@PathVariable("appname") String appName,
PathVariable("path1") String path1,
PathVariable("path2") String path2,
PathVariable("remainder") String remainder)
Я хотел бы, чтобы RequestMapping соответствовал этому
{appname} -> myapp
{path1} -> foo
{path2} -> bar
{remainder} -> rest/of/the/url
В Javadocs для RequestMapping есть заметка об использовании альтернативного регулярного выражения:
По умолчанию шаблон URI будет соответствовать регулярному выражению [^.] * (т.е. любой символ, отличный от периода), но это можно изменить, указав другое регулярное выражение, например:/hotels/{hotel:\d +}
Но это не ведет себя так, как ожидалось (я получаю 404), когда я использую RequestMapping так:
@RequestMapping(value="{appname}/{path1}/{path2}/{remainder:.[\\S]*}")
Кто-нибудь знает, как сопоставить остальную часть URL-адреса с Spring RequestMapping?
Ответы
Ответ 1
Смешная вещь: я просто наткнулся на необходимость сделать это тоже. Вот как я это решил:
@RequestMapping(value = {"/someChildUrlIfYouWant/**"}
"**"
здесь говорится: "Прихватите что-нибудь на любом подпункте того, что слева от меня". Если вы хотите, чтобы путь, который он фактически соответствовал, чтобы получить этот метод, вы можете использовать:
request.getAttribute( HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE )
Вы получите /someChildUrlIfYouWant/the/full/path/to/whatever.html
, поэтому, если вам просто нужен путь к переменной, вам придется обрезать переднюю часть строки.
Имеют смысл?
Ответ 2
Для вышеуказанной попытки:
@RequestMapping(value="{appname}/{path1}/{path2}/{remainder:.+}")
Поведение по умолчанию Spring, чтобы прекратить сопоставление в '.' в URL-адресах не очень интуитивно. Я не думаю, что символ периода имеет какое-либо особое значение в контексте пути (в отличие от "/", ";" или "?" ).