2015-02-20 5 views
1

В службе Spring MVC для отдыха У меня возникают проблемы с попыткой сопоставить все, что находится за пределами моего настроенного значения RequestMapping.Сопоставление чего-нибудь в Spring RequestMapping

Так, например, У меня есть следующее:

@RequestMapping(value = "{configKey}/{arguments:.*}", method = RequestMethod.GET) 

Который говорит, что соответствует всем, что находится за пределами второй переменной пути. Проблема в том, что это, например, работает нормально с:

get("/test/document") 

в то время как это заканчивается 404:

get("/test/document/download") 

Это странно, что весна не может справиться с этим регулярным выражением. Я на самом деле пробовал много решений, но никто из них не работал.

Ранее я имел эту конфигурацию на JAX-RS:

@Path("/{configKey}/{arguments:.*}") 

И все было хорошо, но теперь я мигрирующие и с этой проблемой.

Кто-нибудь знает, что происходит и как это исправить?

EDIT:

Добавление {configKey}/** - не работает

Добавление {configKey}/{arguments}/** работ, но, например, если я позвоню:

get("/test/document/download") Я получаю только test как мой ключ конфигурации и document как аргументы. В аргументах я ожидаю получить все, что находится за пределами {configKey}. Это может быть что угодно, например. она должна работать в любом случае:

get("/test/document") 
get("/test/document/download") 
get("/test/document/download/1") 
get("/test/document/download/1/2") 
get("/test/whatever/xxx/1/2/etc") 

Который работал с конфиг для JAX-RS: @Path("/{configKey}/{arguments:.*}")

+0

Сколько аргументов можно ожидать? Вы знаете точное число? – Spacemonkey

+0

Нет, это точка, она динамична и может быть любым количеством аргументов. –

+0

Что вы хотите связать с 'arguments'? –

ответ

0

Я нашел обходной путь к ней, это не окончательное решение, я думаю, что это ошибка весной, и я поднял Jira, но пока это не фиксируется здесь:

я должен был определить свое отображение запроса, как это:

@RequestMapping(value = "{configKey}/**", method = RequestMethod.GET) 

Таким образом, в основном совпадают все, что после первой переменной в пути.

Тогда:

String arguments = pathMatcher.extractPathWithinPattern(
     request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString(), 
     request.getPathInfo()); 

Если pathMatcher является экземпляром AntPathMatcher используется Spring.

Итак, теперь вызывается HTTP GET on, например. этот путь:

get("/test/leaderboard/user/mq/frankie1") 

У меня есть:

configKey = test 
arguments = leaderboard/user/mq/frankie1 
+1

Эта джира отмечена как «Works as Designed», «Переменные пути в шаблоне @RequestMapping не могут охватывать несколько сегментов пути». Поэтому я думаю, что мы не можем решить эту проблему, но вместо этого использовать параметры запроса. – cmicat

1

Следующая отображение должно работать для вас

@RequestMapping(value = "{configKey}/**", method = RequestMethod.GET) 

Это отображение называется default mapping pattern.

+0

Это не сработает, и, как я уже упоминал, это не будет связывать остальное, что находится за пределами {configKey} до переменной {arguments} переменной пути. –

-1

Spring Используйте AntPathMatcher, отображение ссылок URL, используя следующие правила:

1. ? matches one character 
2. * matches zero or more characters 
3. ** matches zero or more 'directories' in a path 

Это, как настроить запрос отображения URL, у меня тест на моем компьютере, и она работает, и вы можете на основе пользовательских твои нужды.

@RequestMapping(value = "/new-ajax/**", method = RequestMethod.GET) 

Тестовый случай

/new-ajax/document/1 
/new-ajax/document/download/1 
/new-ajax/document/download/1/2 
/new-ajax/test/whatever/xxx/1/2/etc 

 Смежные вопросы

  • Нет связанных вопросов^_^