С помощью Spring я могу сделать необязательную переменную path?

187

В Spring 3.0 я могу иметь необязательную переменную пути?

Например

@RequestMapping(value = "/json/{type}", method = RequestMethod.GET)
public @ResponseBody TestBean testAjax(
        HttpServletRequest req,
        @PathVariable String type,
        @RequestParam("track") String track) {
    return new TestBean();
}

Здесь я хотел бы /json/abcили /jsonвызвать тот же метод.
Один очевидный обходной путь объявляется typeкак параметр запроса:

@RequestMapping(value = "/json", method = RequestMethod.GET)
public @ResponseBody TestBean testAjax(
        HttpServletRequest req,
        @RequestParam(value = "type", required = false) String type,
        @RequestParam("track") String track) {
    return new TestBean();
}

а потом /json?type=abc&track=aaили /json?track=rrбудет работать

Shamik
источник

Ответы:

194

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

@RequestMapping(value = "/json/{type}", method = RequestMethod.GET)
public @ResponseBody TestBean typedTestBean(
        HttpServletRequest req,
        @PathVariable String type,
        @RequestParam("track") String track) {
    return getTestBean(type);
}

@RequestMapping(value = "/json", method = RequestMethod.GET)
public @ResponseBody TestBean testBean(
        HttpServletRequest req,
        @RequestParam("track") String track) {
    return getTestBean();
}
earldouglas
источник
5
@Shamik: По моему мнению, это убедительная причина не использовать переменные пути. Комбинаторное распространение может быстро выйти из-под контроля.
Скаффман
9
На самом деле не потому, что путь не может быть таким сложным, когда он заполнен необязательными компонентами. Если у вас более одного или максимум двух необязательных элементов пути, вам следует серьезно подумать о переключении нескольких из них для запроса параметров.
Патрик Корнелиссен
1
А для некоторых людей вызов второго метода контроллера может также сработать и для первого метода контроллера, если, например, отличающийся параметр может быть предоставлен каким-либо другим способом
chrismarx
3
Пожалуйста, рассмотрите возможность обновления своего ответа, вместо создания двух методов контроллера в более новой версии Spring, мы можем просто использовать @RequestMappingс двумя значениями, как в: stackoverflow.com/questions/17821731/…
csharpfolk
Боже мой, как вы ожидаете сохранить эти конечные точки? И если вместо одной переменной пути у нас будет 5, сделайте для меня математику, сколько конечных точек вы бы сделали? Пожалуйста, сделайте мне одолжение и замените @PathVariableна@RequestParam
Гильерме Аленкар