我从Spring Portlet MVC
开始,但我相信这个问题也适用于Spring MVC
。让我告诉你这个例子
@Controller
@RequestMapping(value="VIEW")//this maps to Portlet Mode VIEW
public class LoginController {
@RenderMapping("action=showRegisterPage")
//this annotation is almost the same like @RequestMapping
public String showRegisterPage() {
return "registration";
}
@ModelAttribute("loginForm")
public LoginForm getLoginForm() {
return new LoginForm();
}
}
然后是注册页面的控制器
@Controller
@RequestMapping(value="VIEW")
public class RegistrationController {
@ModelAttribute("user")
public User getUser() {
return new User();
}
}
问题是,当我从第I页调用showRegisterPage方法(action)时,会被重定向到registration.jsp,但会出现此异常
Caused by: java.lang.IllegalStateException: Neither BindingResult nor
plain target object for bean name 'user' available as request attribute
这可以通过将ModelAttribute
用户放到LoginController来修复,但代码重复不是正确的方法,那么如何才能正确解决?我还尝试将showRegisterPage方法移动到RegistrationController但是链接不起作用。也许有人可以详细说明页面与某个控制器的完全绑定是如何工作的?
P.S。 index.jsp和registration.jsp都包含<form:form>
标记,我也省略了两个控制器的样板代码。
答案 0 :(得分:1)
抛出异常是因为当您转到注册页面模型时没有用户属性。我想你的注册页面包含像这样的smth
<form:form commandName="user" >
这就是为什么当您将此代码粘贴到第一个控制器时错误消失
@ModelAttribute("user")
public User getUser() {
return new User();
}
此代码为模型提供用户对象。 如果你不想复制一次方法,你可以
@RenderMapping("action=showRegisterPage")
//this annotation is almost the same like @RequestMapping
public String showRegisterPage(Model model) {
model.addAttribute("user", new User());
return "registration";
}
在这种情况下,模型将包含用户对象。
答案 1 :(得分:0)
理想情况下,showregistrationpage方法应该是注册控制器的一部分而不是登录控制器。