Необязательные переменные пути в Spring-MVC RequestMapping URITemplate - PullRequest
10 голосов
/ 21 октября 2011

У меня есть следующее отображение:

@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 на first и bar to last и работает нормально.

Мне бы хотелось, чтобы что-то отображало все между foo и bar в один параметр пути, или ноль, если нетmiddle (как в последнем примере 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:. *}, которое only отображается в /foo / a / bar или {middle: (. * /) *}, который, кажется, ничего не отображает.

Размещает ли AntPathStringMatcher токен "/" перед применением шаблонов регулярных выражений?(создание шаблонов, которые пересекают / невозможно) или есть решение?

К вашему сведению, это весной 3.1M2

Это похоже на @ контроллеры RequestMapping и динамические URL-адреса но я не видел там решения.

Ответы [ 4 ]

14 голосов
/ 24 мая 2013

В моем проекте я использую внутреннюю переменную в 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);
}

См. HandlerMapping.html # URI_TEMPLATE_VARIABLES_ATTRIBUTE

1 голос
/ 19 ноября 2012

Это можно сделать, написав собственный сопоставитель путей и настроив Spring для его использования. Например, такое решение задокументировано здесь: http://java.dzone.com/articles/spring-3-webmvc-optional-path

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

Кроме того, это дубликат В Spring 3.0 можно ли создать дополнительную переменную пути?

1 голос
/ 16 мая 2012

Насколько я знаю, это невозможно сделать.Как вы и сказали, регулярное выражение применяется к элементу пути после разбиения пути в каждом слэше, поэтому регулярное выражение никогда не может совпадать с '/'.

. Вы можете вручную проверить URL и выполнить синтаксический анализ.это самостоятельно из объекта запроса.

0 голосов
/ 15 сентября 2014

попробуйте использовать этот

@RequestMapping(value = {"some mapped address","some mapped address with path variable","some mapped address with another path variable"})

список массивов доступных URL-адресов для определенного метода

Но будьте осторожны при создании списка URL-адресов, когда вы используете @PathVariable в сигнатуре метода.быть нулевым.

надеюсь, что эта помощь

...