В чем смысл {id:. +} В методе обработчика запроса MVC Spring MVC?

Я наткнулся на метод в контроллере. Что это за идентификатор:. +??

@RequestMapping(value="/index/{endpoint}/{type}/{id:.+}", method=RequestMethod.POST, consumes=kContentType, produces=kProducesType)
@ResponseBody
public String indexData(@PathVariable(value="endpoint") String endpoint, @PathVariable(value="type") String type, @PathVariable(value="id") String id, @RequestBody String body, HttpServletRequest request) {
    logger.debug("In web controller for endpoint " + endpoint);
    return indexController.indexData(endpoint, type, id, body,  getSecurityContextProvider(request));
}

Ответы

Ответ 1

Синтаксис переменной пути в шаблоне запроса контроллера spring MVC равен {variable_name:regular_expression}. Вы можете опционально опустить регулярное выражение, которое приводит к тому, что вы видите чаще, {id}.

Итак, для примера /index/{endpoint}/{type}/{id:.+} имя переменной id, а регулярное выражение - .+ (см. ниже ссылку на spring docs).

Регулярное выражение .+ указывает "сопоставить метасимвол . один или несколько раз". "." metacharacter представляет любой символ, включая пробел (хотя некоторые реализации не соответствуют символам новой строки). См. http://en.wikipedia.org/wiki/Regular_expression

Регулярное выражение используется, чтобы помочь spring определить значение переменной, потому что у вас могут быть сложные имена переменных или может быть другая важная информация в конце пути, которая в противном случае была бы втянута в значение переменной, если spring просто сказал "идти до конца пути" (например, расширения файлов или переменные пути).

Возможно, что в вашем примере переменная id может содержать специальные символы, которые в противном случае вызывают spring досрочно прервать переменную. Я столкнулся с этой проблемой, прежде чем пытаться использовать имя файла, содержащее расширение файла (foobar.jpg). spring будет возвращать только часть "foobar" переменной, потому что spring предполагал, что я хотел, чтобы она прекратила значение переменной в разделителе периодов. Итак, в этом случае, чтобы убедиться, что "id" соответствует полному значению, вы помещаете регулярное выражение, которое сообщает spring, чтобы идти вперед и сопоставлять все между последней косой чертой и концом пути. SO Ссылка: Spring MVC @PathVariable получает усеченный

Здесь выдержка из документов spring, которая имеет дело с комплексным сопоставлением переменных:

Иногда вам нужно больше точности в определении переменных шаблона URI. Рассмотрите URL-адрес "/ spring-web/spring-web-3.0.5.jar". Как вы разбиваете его на несколько частей?

Аннотации @RequestMapping поддерживают использование регулярных выражений в переменных шаблона URI. Синтаксис: {varName: regex}, где первая часть определяет имя переменной, а вторая - регулярное выражение.

Вот их (довольно сложный) пример:

@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]+}")
public void handle(@PathVariable String version, @PathVariable String extension) {
    // ...
}

Источник: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html

Пример, который они предоставляют, показывает, как вы выполняете сложные сопоставления от запросов к параметрам метода контроллера, которые вы не сможете использовать, не используя регулярное выражение.