今天早上看到一个问题:
@Controllerpublic class ExampleController { @RequestMapping("/index") public String index(Long id) { System.out.println(id); return "index"; }}
使用spring3.2.3时,在浏览器输入:= 会报如下错误:
写道
HTTP ERROR 400 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