Как создать @RequestMapping @PathVariable, чтобы включить / в параметр?

Есть ли способ в Spring 3.x, чтобы PathVariable в сопоставлении запроса включала переадресацию /? Я пробовал разные регулярные выражения, которые, как мне казалось, должным образом анализировались, но, похоже, им никогда не удавалось подобрать перенаправление /.

Я нашел этот связанный вопрос SO, но это больше зависит от кодирования URL-адресов параметров, что не совсем моя проблема.

Я пробовал следующий @RequestMapping, но безрезультатно:

@RequestMapping(value = "/template/{definitionName:[a-zA-Z0-9_./]+}/{attributeName:.+}", method = RequestMethod.GET)
@RequestMapping(value = "/template/{definitionName}/{attributeName:[^/]+}", method = RequestMethod.GET)

Например, я пытаюсь сопоставить следующие URL-адреса:

http://localhost:8880/mustache/template/users/info/user_info.updateable

где

  • "users/info" будет определением.
  • "user_info.updateable" будет атрибутом.

Полный прототип метода будет таким:

  @RequestMapping(value = "/template/{definitionName:[a-zA-Z0-9_./]+}/{attributeName:.+}", method = RequestMethod.GET)
    public static void fetchTemplateDefinition(
            @PathVariable("definitionName") final String definitionName,
            @PathVariable("attributeName") final String attributeName,
            final HttpServletRequest request,
            final HttpServletResponse response) throws ServletException, IOException
    {...}

Есть ли способ сопоставить параметры, которые содержат / в URL-адресе?


person Eric B.    schedule 08.01.2014    source источник
comment
Ваше первое регулярное выражение завершится ошибкой, потому что . соответствует любому символу, а регулярные выражения по умолчанию являются жадными, поэтому часть definitionName будет соответствовать users/info/user_info.updateable, и для attributeName ничего не останется.   -  person Taylor    schedule 08.01.2014
comment
@Taylor На самом деле, '.' в наборе символов должен быть литерал '.' персонаж; не подстановочный знак. Но это все равно не объясняет, почему второе регулярное выражение не работает.   -  person Eric B.    schedule 08.01.2014
comment
Ваше намерение может быть буквальным. характер, но если вы не избежите его, это не то, что есть.   -  person Taylor    schedule 08.01.2014
comment
@Taylor - Ты уверен в этом? Насколько мне известно, наборы символов Regex являются буквальными, поэтому [.] будет '.' символ, а не подстановочный знак.   -  person Eric B.    schedule 08.01.2014


Ответы (1)


Из коробки это невозможно. Spring вызывает PathMatcher.extractUriTemplateVariables() для извлечения переменных пути. Реализация PathMatcher по умолчанию — AntPathMatcher, которая разбивает путь и шаблон пути на части, используя / в качестве разделителя.

Единственным решением было бы реализовать свой собственный PathMatcher (или расширить AntPathMatcher) и указать Spring использовать его.

person a better oliver    schedule 08.01.2014
comment
Спасибо за совет. Есть идеи, как настроить PathMatcher в Spring 3.2? AnnotationMethodHandlerAdapter устарел в обмен на RequestMappingHandlerAdapter, у которого нет PathMatcher. Единственное место, где я его нашел, было в WebContentInterceptor. Это правильное место? Как настроить WebContentInterceptor? - person Eric B.; 09.01.2014
comment
@ЭрикБ. RequestMappingHandlerMapping - person a better oliver; 09.01.2014
comment
Я что-то упускаю? Я нигде не вижу в RequestMappingHandlerMapping, чтобы установить PathMatcher. - person Eric B.; 09.01.2014
comment
@ЭрикБ. Сам метод определен в абстрактном базовом классе AbstractHandlerMapping - person a better oliver; 09.01.2014