当我的表单无法验证时,我总是收到以下错误:
org.apache.jasper.JasperException:java.lang.IllegalStateException:BindingResult和bean名称'regform'的普通目标对象都不可用作请求属性
表单输入有效时,我不会收到此错误。根本原因是
java.lang.IllegalStateException: 既不是BindingResult也不是普通的目标 bean名称'regform'的对象 可用作请求属性
以下是net.sandbox.controllers.RegistrationController
,为了简洁起见省略了导入:
@Controller
@RequestMapping("/register")
public class RegistrationController {
@Autowired
private UserInfo userInfo;
@RequestMapping(method = RequestMethod.GET)
public String showRegForm(Model model) {
RegistrationForm regForm = new RegistrationForm();
model.addAttribute("regform", regForm);
return "regform";
}
@RequestMapping(method = RequestMethod.POST)
public String validateForm(@Valid RegistrationForm regForm, BindingResult result, Model model) {
if (result.hasErrors()) {
return "regform";
}
userInfo.setUserName(regForm.getFirstName());
model.addAttribute("regform", regForm);
return "regsuccess";
}
}
这是什么意思?
更新:添加了请求的JSP文件。
regform.jsp
<jsp:include page="includes/header.jsp">
<jsp:param name="pageTitle" value="Registration" />
</jsp:include>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<h2>Register below.</h2>
<form:form method="post" commandName="regform">
<p><form:input path="firstName" /> <form:errors path="firstName" /></p>
<p><input type="submit" /></p>
</form:form>
<jsp:include page="includes/footer.jsp" />
header.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<jsp:useBean id="userInfo" scope="session" class="net.sandbox.sessionbeans.UserInfo" />
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%= request.getParameter("pageTitle") %></title>
</head>
<body>
<h1 style="float: left; width: 50%">Sandbox -- <%= request.getParameter("pageTitle") %></h1>
<h4 style="float: left; text-align: right; width: 50%"><% out.print(userInfo.getUserName()); %></h4>
<hr style="clear: both" />
footer.jsp
<hr />
<p><i>Copyright information goes here.</i></p>
</body>
</html>
答案 0 :(得分:0)
这是因为,在您的validateForm(..)
方法中,一旦表单验证失败,您就不会将表单支持对象放入modelMap。如果您要重新组织代码,请执行以下操作:
@RequestMapping(method = RequestMethod.POST)
public String validateForm(@Valid RegistrationForm regForm, BindingResult result, Model model) {
model.addAttribute("regform", regForm);
if (result.hasErrors()) {
return "regform";
}
userInfo.setUserName(regForm.getFirstName());
return "regsuccess";
}
您可以解决您的问题,但它仍然不是最佳解决方案。最佳做法是使用一种方法来填充表单对象,如下所示:
@ModelAttribute("regform")
public RegistrationForm populateForm() {
RegistrationForm regForm = new RegistrationForm();
/* init regForm */
return regForm;
}
使用populateForm方法,您无需自己处理表单支持对象的创建。