Spring @RequestParam doesn't handle multiple variables correctly - example test case
The test case given below shows a simple case where I have 2 parameters paramA
and paramB
.
- If I call the
/paramtest
url theparamtest()
method is called. - If I enter
true
forparamA
, methodaTrue()
is called. - However, when I enter
true
for bothparamA
andparamB
the methodbTrueNotA()
is called.
But the 3rd @RequestMapping
calls for A=True
and B!=true
. By my reconing when both paramete开发者_Go百科rs are true, aTrue()
should be called.
@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";
}
I think it might be a bug in Spring. I tried with the following mappings:
@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"; }
and using your existing form with the following parameters, these were the results I got:
paramA=true
A() called as expected
paramA=true, paramB=foobar
B() called as expected
paramA=not_true, paramB=foo
404 page, and not C() as expected.
I got this error on the Tomcat console:
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']]
All of this with Spring 3.0.5. Note that the myParam!=myValue
was only available from Spring 3.0.4 onwards (the 3.0.3 doc does not list that option). Also, I do not think that !myParam=myValue
is valid, as this is not listed in the current 3.0.5 documentation.
Sorry this is not a solution to your problem but wanted to share my investigation :)
精彩评论