Spring 3.2.3バインディングパラメータbug

2270 ワード

今朝問題を見ました。http://www.iteye.com/problems/95447
 
@Controller
public class ExampleController {

    @RequestMapping("/index")
    public String index(Long id) {
        System.out.println(id);
        return "index";
    }

}
  スプリング3.2.3を使用する場合は、ブラウザで入力します。http://localhost/index?id= 以下のエラーを報告します。
 
書き記す
HTTP ERROR 400
Problem accessing/es-web/monitor.Reason:
Required Long parameter'userId'is not present
パワードby Jetty://
spring 3.2.3以前のバージョンは大丈夫です。
 
spring 3.2.3はちょっと変わったところがあります。
そのorg.springframe ework.web.method.annotations.Abstract NamedValueMethodAgMentResoloverのresoveAgAgment方法において:
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);
}
ただし、前のバージョンはこの状況を処理しません。
 
したがって、以下のコードパラメータがあるかどうかにかかわらず、必要です。
@Request Param(value="username",required=false) 
 
これはバグです。ジラを提出しました
https://jira.springsource.org/browse/SPR-10592