springMVC参数顺序不同导致异常

spring版本:3.2.4

hibernate-validator版本:4.2.0

我做了一个简单测试:注册用户时,不考虑js验证,利用hibernate-validator在Controller中进行验证属性为空时的错误

Domain对象User代码如下:

public class User {
	@NotEmpty
	private String userName;//验证userName为空是否出现验证错误
	private String password;
        ..setter/getter
}

 Controller对象代码如下:

	@RequestMapping(value = "/registUser")
	public String registUser(RedirectAttributes flashAttr, //redirect跳转时候传递参数的方式
                                         @Valid User user,     //对jsp页面传递过来的User对象验证是否userName为空
			                 BindingResult result) {
		System.out.println("是否验证出错:" + result.hasErrors());
		flashAttr.addFlashAttribute("currentUser", user);
		return "redirect:/login/registSuccess";//注册用户成功跳转至另一个controller
	}

 看到了吧,这样的参数顺序是绝对没有问题的,当前台传递空userName的时候打印错误是true

 变动1:当我把参数顺序变为:@Valid User user, RedirectAttributes flashAttr,BindingResult result的时候,异常出现了,如下:

扫描二维码关注公众号,回复: 589180 查看本文章

HTTP Status 400 -


type Status report

message

description The request sent by the client was syntactically incorrect ().


Apache Tomcat/6.0.32

变动2:当我把参数顺序变为: RedirectAttributes flashAttr,BindingResult result,@Valid User user的时候,异常出现了,如下:

内容是我自定义500页面显示出来的,显示是500错误,说明BindingResult result参数可能必须放在最后

系统执行发生错误,信息描述如下:
错误状态代码是:500
错误发生页面是:/springtest/login/registUser
异常是:java.lang.IllegalStateException: An Errors/BindingResult argument is expected to be declared immediately after the model attribute, the @RequestBody or the @RequestPart arguments to which they apply: public java.lang.String com.cmcc.foura.login.action.LoginAction.registUser(org.springframework.web.servlet.mvc.support.RedirectAttributes,org.springframework.validation.BindingResult,com.cmcc.foura.login.domain.User)
错误信息:java.lang.IllegalStateException: An Errors/BindingResult argument is expected to be declared immediately after the model attribute, the @RequestBody or the @RequestPart arguments to which they apply: public java.lang.String com.cmcc.foura.login.action.LoginAction.registUser(org.springframework.web.servlet.mvc.support.RedirectAttributes,org.springframework.validation.BindingResult,com.cmcc.foura.login.domain.User)
发生错误时request中的参数:
password=111
userName=

错误堆栈信息:
org.springframework.web.method.annotation.ErrorsMethodArgumentResolver.resolveArgument(ErrorsMethodArgumentResolver.java:62) org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77) org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:123) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)

以上就是我简单调整了参数顺序得到的不同的结果,有对springMVC有深刻了解的童鞋能够解答吗?

猜你喜欢

转载自yuechen323.iteye.com/blog/1927797