今天早上看到一个问题: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