Spring3.2.3 绑定参数bug

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

而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

猜你喜欢

转载自jinnianshilongnian.iteye.com/blog/1878631