Spring3.2.3 绑定参数bug
程序员文章站
2022-04-08 16:42:54
...
今天早上看到一个问题:http://www.iteye.com/problems/95447
@Controller public class ExampleController { @RequestMapping("/index") public String index(Long id) { System.out.println(id); return "index"; } }
使用spring3.2.3时,在浏览器输入:http://localhost/index?id= 会报如下错误:
写道
HTTP ERROR 400
Problem accessing /es-web/monitor. Reason:
Required Long parameter 'userId' is not present
Powered by Jetty://
Problem accessing /es-web/monitor. Reason:
Required Long parameter 'userId' is not present
Powered by Jetty://
而spring3.2.3之前的版本是没有问题的。
spring3.2.3做了点小改变:
在其org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver的resolveArgument方法中:
Object arg = resolveName(namedValueInfo.name, parameter, webRequest); if (arg == null) { if (namedValueInfo.defaultValue != null) { arg = resolveDefaultValue(namedValueInfo.defaultValue); } else if (namedValueInfo.required) { handleMissingValue(namedValueInfo.name, parameter); } arg = handleNullValue(namedValueInfo.name, arg, paramType); } else if ("".equals(arg) && (namedValueInfo.defaultValue != null)) { arg = resolveDefaultValue(namedValueInfo.defaultValue); } boolean emptyArgValue = "".equals(arg); if (binderFactory != null) { WebDataBinder binder = binderFactory.createBinder(webRequest, null, namedValueInfo.name); arg = binder.convertIfNecessary(arg, paramType, parameter); } if (emptyArgValue && (arg == null)) { handleMissingValue(namedValueInfo.name, parameter); } handleResolvedValue(arg, namedValueInfo.name, parameter, mavContainer, webRequest); return arg;
多添加了如下代码来处理null的情况,而handleMissingValue默认是抛异常的:
if (emptyArgValue && (arg == null)) { handleMissingValue(namedValueInfo.name, parameter); }
但是如果之前版本就不处理此情况。
所以综上,不管你是不是有如下代码参数都是必须的。。。
@RequestParam(value="username", required=false)
这是个bug。。提交了其jira
https://jira.springsource.org/browse/SPR-10592