Spring @RequestParam неправильно обрабатывает несколько переменных - пример теста - PullRequest
3 голосов
/ 14 марта 2011

Тестовый пример, приведенный ниже, показывает простой случай, когда у меня есть 2 параметра paramA и paramB.

  • Если я вызываю /paramtest url, вызывается метод paramtest().
  • Если я введу true для paramA, вызывается метод aTrue().
  • Однако, когда я ввожу true для paramA и paramB, вызывается метод bTrueNotA().

Но 3-й @RequestMapping требует A=True и B!=true. По моим сведениям, когда оба параметра верны, aTrue() должен быть вызван.

@RequestMapping("paramtest")
@ResponseBody
public String paramtest(){
    return  "<html><head></head><body>" +
                "<form action=paramtest method=post>" +
                    "paramA: <input type=text name=paramA /><br>" +
                    "paramB: <input type=text name=paramB /><br>" +
                    "<input type=submit>" + 
                "</form>" +
            "</body></html>";       
}

@RequestMapping(value="paramtest", params="paramA=true")
@ResponseBody
public String aTrue(){
    return "A=true";
}

@RequestMapping(value="paramtest", params={"paramB=true", "paramA!=true"})
@ResponseBody
public String bTrueNotA(){
    return "B=True; A!=true";
}

1 Ответ

1 голос
/ 15 марта 2011

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

@RequestMapping(value="/paramtest", params={"paramA=true"})
@ResponseBody
public String function A() { return "A"; }

@RequestMapping(value="/paramtest", params={"paramA=true", "paramB=foobar"})
@ResponseBody
public String function B() { return "B"; }

@RequestMapping(value="/paramtest", params={"paramA=!true", "paramB=foo"})
@ResponseBody
public String function C() { return "C"; }

и используя вашу существующую форму со следующими параметрами, я получил следующие результаты:

paramA=true A () вызывается как ожидалось

paramA=true, paramB=foobar B () вызывается как ожидалось

paramA=not_true, paramB=foo 404, а не C (), как ожидалось.

Я получил эту ошибку на консоли Tomcat:

WARN org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver 142 - No matching handler method found for servlet request: path '/paramtest', method 'POST', parameters map['paramB' -> array<String>['foo'], 'paramA' -> array<String>['not_true']]

Все это в Spring 3.0.5. Обратите внимание, что myParam!=myValue был доступен только начиная с Spring 3.0.4 (в 3.0.3 doc эта опция не указана). Кроме того, я не думаю, что !myParam=myValue является действительным, так как это не указано в текущей версии 3.0.5 .

Извините, это не решение вашей проблемы, но хотел поделиться своим исследованием:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...