Сопоставьте "Остальную часть 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-адресах не очень интуитивно. Я не думаю, что символ периода имеет какое-либо особое значение в контексте пути (в отличие от "/", ";" или "?" ).