Neither BindingResult nor plain target object for bean name 'userProfile' available as request attribute
I've encountered the folowing exception while I was trying to implement my first spring+hibernate web app:
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'userProfile' available as request attribute
at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:141)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:174)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:194)
at org.springframework.web.servlet.tags.form.LabelTag.autogenerateFor(LabelTag.java:129)
...
UserController.java:
@Controller
public class UserController {
@Autowired
private UserProfileService userProfileService;
public UserController(){
}
@RequestMapping(value="/add", method=RequestMethod.POST)
public String registerUser(@ModelAttribute("userProfile") UserProfile userProfile, BindingResult result, Map model){
userProfileService.addUserProfile(userProfile);
return "redirect:/login";
}
...
}
UserProfile.java
@Entity
@Table(name="USER_PROFILE")
public class UserProfile {
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@Column(name = "USERNAME")
private String userName;
@Column(name = "PASSWORD")
private String password;
//sets and gets
}
index.jsp
<form:form method="post" action="add" commandName="userProfile">
<table>
<tr>
<td><form:label path="userName"><spring:message code="label.username" /></form:label></td>
<td><form:input path="userName" /></td>
</tr>
<tr>
<td><form:label path="password"><spring:message code="label.password" /></form:label></td>
<td><form:password path="password" /></td>
</tr>
<tr>
<td><inp开发者_Python百科ut type="submit" value="<spring:message code="label.adduser" />"></td>
</tr>
</table>
</form:form>
I wasn't noticed that I have to implement method for form creation which will provide instance of UserProfile. I've added 2 methods and now everything works fine.
@RequestMapping("/")
public String home() {
return "redirect:/index";
}
@RequestMapping(value = "/index", method = RequestMethod.GET)
public String createRegisterForm(Map<String, Object> model){
model.put("userprofile", new UserProfile());
return "index";
}
Add modelAttribute="userProfile"
to the <form:form>
tag.
<form:form method="post" action="add" commandName="userProfile" modelAttribute="userProfile">
Try adding BindingResult as a method parameter next to @ModelAttribute("userProfile") UserProfile userProfile
Spring looks for BindingResult parameter after each @ModelAttribute
Adding this to your controller should fix it
model.addAttribute(new UserProfile());
@ModelAttribute("userProfile")
public UserProfile getProfile(){
return new UserProfile();
}
<form:form method="post" action="add" modelAttribute="userProfile">
精彩评论