欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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://

而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