我在spring-mvc + hibernate应用程序中向ModelAndView添加了一个Employee类型的命令对象。 jsp有一个简单的形式,将以两种方式使用。
1)创建新的员工帐户
2)编辑现有帐户(此处表格将预填充。)
在帐户创建案例中,添加的命令对象为new Employee()
。但是在第二种情况下,我从数据库加载employee对象并将其作为命令对象传递。这填充表单而不明确提及其他任何内容。
但是在提交编辑后的表单时,hibernate无法找到标识符,从而引发异常 -
org.springframework.web.util.NestedServletException: Request processing failed; nested
exception is org.hibernate.TransientObjectException: The given object has a null
identifier: org.kodeplay.springroll.model.Employee
映射到此表单操作的控制器方法是
@RequestMapping(value="/update.htm", method = RequestMethod.POST)
public ModelAndView update(@ModelAttribute("employee") Employee employee,
BindingResult result) {
Map<String, String> errors = employeeService.validationErrors(employee);
if(errors.isEmpty()) {
//success
employeeService.editEmployee(employee);
ModelAndView mav = this.displayList();
mav.addObject("success", "Employee Updated Successfully");
return mav;
}
else {
//show form again with errors
ModelAndView mav = this.displayForm(employee);
mav.addObject("errors", errors);
return mav;
}
}
private ModelAndView displayForm(Employee employee) {
ModelAndView mav = new ModelAndView("employee/form");
if(employee == null){
mav.addObject("command", new Employee());
}
else {
mav.addObject("command", employee);
}
return mav;
}
是不是Spring mvc控制器中的@ModelAttribute注释参数不是传递的实际命令对象,而是与命令对象相同类型的新对象?这是正常行为还是我错过了什么?
实现这一目标的方法是什么?将标识符作为隐藏表单输入传递?
由于
答案 0 :(得分:0)
添加命令对象时,应该使用名称employee而不是命令,即ModelAttribute name。