Необязательные переменные пути в Spring-MVC RequestMapping URITemplate
У меня есть следующее отображение:
@RequestMapping(value = "/{first}/**/{last}", method = RequestMethod.GET)
public String test(@PathVariable("first") String first, @PathVariable("last")
String last) {}
Который для следующих URI:
foo/a/b/c/d/e/f/g/h/bar
foo/a/bar
foo/bar
сопоставляет foo с первым и bar до последнего и работает нормально.
То, что я хотел бы, это то, что отображает все между foo и bar в один параметр пути, или ноль, если нет среднего (как в последнем примере URI):
@RequestMapping(value = "/{first}/{middle:[some regex here?]}/{last}",
method = RequestMethod.GET)
public String test(@PathVariable("first") String first, @PathVariable("middle")
String middle, @PathVariable("last") String last) {}
Довольно сильно застрял в регулярном выражении, поскольку я надеялся, что что-то простое, например {middle:.*}, Будет отображаться только в /foo/a/bar или {middle:(.*/)*}, Что, кажется, ничего не отображает.
AntPathStringMatcher маркирует на "/" до применения шаблонов регулярных выражений? (создание шаблонов, которые пересекают / невозможно) или есть решение?
К вашему сведению это весной 3.1M2
Это похоже на контроллеры @RequestMapping и динамические URL-адреса, но я там не нашел решения.
4 ответа
В моем проекте я использую внутреннюю переменную в Springframework:
@RequestMapping(value = { "/trip/", // /trip/
"/trip/{tab:doa|poa}/",// /trip/doa/,/trip/poa/
"/trip/page{page:\\d+}/",// /trip/page1/
"/trip/{tab:doa|poa}/page{page:\\d+}/",// /trip/doa/page1/,/trip/poa/page1/
"/trip/{tab:trip|doa|poa}-place-{location}/",// /trip/trip-place-beijing/,/trip/doa-place-shanghai/,/trip/poa-place-newyork/,
"/trip/{tab:trip|doa|poa}-place-{location}/page{page:\\d+}/"// /trip/trip-place-beijing/page1/
}, method = RequestMethod.GET)
public String tripPark(Model model, HttpServletRequest request) throws Exception {
int page = 1;
String location = "";
String tab = "trip";
//
Map pathVariables = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
if (pathVariables != null) {
if (pathVariables.containsKey("page")) {
page = NumberUtils.toInt("" + pathVariables.get("page"), page);
}
if (pathVariables.containsKey("tab")) {
tab = "" + pathVariables.get("tab");
}
if (pathVariables.containsKey("location")) {
location = "" + pathVariables.get("location");
}
}
page = Math.max(1, Math.min(50, page));
final int pagesize = "poa".equals(tab) ? 40 : 30;
return _processTripPark(location, tab, pagesize, page, model, request);
}
Не могу сделать, насколько я знаю. Как вы уже сказали, регулярное выражение применяется к элементу пути после разбиения пути в каждом слэше, поэтому регулярное выражение никогда не может совпадать с '/'.
Вы можете вручную просмотреть URL-адрес и разобрать его самостоятельно из объекта запроса.
Это можно сделать, написав собственный сопоставитель путей и настроив Spring для его использования. Например, такое решение описано здесь: http://java.dzone.com/articles/spring-3-webmvc-optional-path
Ссылка предоставляет настраиваемое сопоставление пути и показывает, как настроить Spring для его использования. Это должно решить ваши потребности, если вы не против написания пользовательского компонента.
Кроме того, это копия С Spring 3.0, я могу сделать необязательную переменную пути?
Попробуйте использовать это
@RequestMapping(value = {"some mapped address","some mapped address with path variable","some mapped address with another path variable"})
список массивов доступных URL для определенного метода
Но будьте осторожны при создании списка URL, когда вы используете @PathVariable в сигнатуре вашего метода, он не может быть нулевым.
надеюсь, это поможет