Spring 3.0 множественная проблема @PathVariable

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

@RequestMapping(value = "/products/{proId1}Vs{proId2}Vs{proId3}", method = RequestMethod.GET)
public ModelAndView compareThreeProducts(@PathVariable("proId1") int id1, @PathVariable("proId2") int id2, @PathVariable("proId3") int id3)
{
   //someLogic

при нажатии на мой URL-адрес (http://something/products/12Vs13Vs14)

Я получаю ошибку http 400

Я также пробовал для 2 @pathVariable, например

@RequestMapping(value = "/products/{proId1}Vs{proId2}", method = RequestMethod.GET)
public ModelAndView compareTwoProducts(@PathVariable("proId1") int id1, @PathVariable("proId2") int id2) 

это работает нормально, но почему я столкнулся с проблемой с 3 переменными, а также в журнале сервера нет ошибок, тогда как найти, в чем ошибка.

любое решение??


person Raju    schedule 11.08.2011    source источник
comment
Пожалуйста, покажите нам заголовок методов. Также вы уверены, что в названии одного из ваших продуктов нет строки Vs?   -  person kurochenko    schedule 11.08.2011
comment
Я изменил свой пост, как вы просили. Я использую целые числа, а не строки   -  person Raju    schedule 11.08.2011
comment
Я могу подтвердить проблему для Spring 4, используя только косые черты в качестве разделителей.   -  person Michael Piefel    schedule 09.01.2014


Ответы (3)


Вы можете попробовать объединить все в одну переменную пути, а затем проанализировать ее вручную:

@RequestMapping(value = "/products/{compareIdString}", method = RequestMethod.GET)
public ModelAndView compareThreeProducts(@PathVariable("compareIdString") String compareIdString)
{
    // split compareIdString on "Vs"
    // parse each resulting value to an int

Однако это скорее обходной путь, чем решение. Возможно, вы захотите отладить код Spring, как предложил Божо, если хотите попытаться выяснить, что именно происходит не так.

person sdouglass    schedule 11.08.2011

Как насчет явного указания регулярного выражения, которому должна соответствовать каждая переменная пути, как описано здесь?

@RequestMapping(value = "/products/{proId1:\d+}Vs{proId2:\d+}Vs{proId3:\d+}", method = RequestMethod.GET)

person oksayt    schedule 27.10.2011

  • убедитесь, что проблема не в ответе - поставьте точку останова в методе и посмотрите, вызывается ли он
  • проверьте файлы журналов на наличие признаков
  • попробуйте использовать косую черту в качестве разделителя /products/{p1}/{p2}/{p3} или /products/{p1}/vs/{p2}/vs/{p3}
person Bozho    schedule 11.08.2011
comment
Я просмотрел все свои файлы журналов и не нашел ошибок. Единственная ошибка, которую я получаю, это статус http 400 (запрос, отправленный клиентом, был синтаксически неверным ().) - person Raju; 11.08.2011
comment
затем попробуйте другие два пункта. И еще - не могли бы вы проверить с помощью firebug, как выглядит запрос? - person Bozho; 11.08.2011
comment
Извините, что в качестве требования нашего проекта я должен использовать «Vs»... любое другое решение.. - person Raju; 11.08.2011
comment
Но попробуйте без Vs, только ради эксперимента и выявления проблемы. - person Bozho; 11.08.2011
comment
{p1}/{p2}/{p3} работает нормально, и я попробовал «Vs» в качестве разделителя для двух идентификаторов, он также работал нормально. - person Raju; 11.08.2011
comment
затем запустите ошибку в трекере весенних проблем и используйте косую черту (например, у вас может быть 12/vs/23/vs/34. - person Bozho; 11.08.2011
comment
12/vs/23/vs/34 для такого типа отображения также работает нормально, но я не могу понять, почему это не работает для «Vs» - person Raju; 11.08.2011
comment
@Raju, это может быть ошибка, или Spring не может выбрать, какой метод использовать, в зависимости от сопоставления. Когда вы закомментируете метод compareTwoProducts и снова попробуете http://something/products/12Vs13Vs14 url, он сработает. - person kurochenko; 11.08.2011