简体   繁体   English

Spring MVC @ModelAttribute来自表单的零ID

[英]Spring MVC @ModelAttribute zero ID from form

I load existing User object as @ModelAttribute into a Spring Form (and it correctly displays corresponding ID and Name), but when I modify Name and try to read it back on submit I get zero ID in processEditSubmit (name is correctly changed). 我将现有的User对象作为@ModelAttribute加载到Spring Form中(并且它正确显示相应的ID和Name),但是当我修改Name并尝试在提交时读取它时,我在processEditSubmit获得零ID(名称被正确更改)。

User.java User.java

@Entity
@Table(name = "\"user\"")
public class User {

    @Id
    // @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private int id;

    @Column
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

EditUser.jsp EditUser.jsp

<table>
    <form:form modelAttribute="userCmd" action="update" method="post" >
        <tr><td>ID:</td><td><form:input disabled="true" path="id" /></td><td><form:errors path="id" cssClass="error"/></td></tr>
        <tr><td>Name:</td><td><form:input path="name"/></td><td><form:errors path="name" cssClass="error"/></td></tr>
        <tr><td colspan="3"><input type="submit" value="Save"/></td></tr>
    </form:form>
</table>

ManageUsers.java ManageUsers.java

@Controller
@RequestMapping("/users")
public class ManageUsers {

    @Autowired
    private UserValidator userValidator;

    @Autowired
    private UserManager userManager;

    @InitBinder
    private void initBinder(WebDataBinder binder) {
        // binder.setValidator(userValidator);
        // binder.registerCustomEditor(User.class, new UserEditor());
    }

    @RequestMapping(method = RequestMethod.GET)
    public String viewUsers(ModelMap model) {
        UserList ul = new UserList();
        List<User> users = userManager.getUsers();
        ul.setUserList(users);
        model.addAttribute("userListCmd", ul);
        return "manageUsers";
    }

    @RequestMapping(value = "/edit", method = RequestMethod.GET)
    public String editUser(@RequestParam int id, ModelMap model) {
        model.addAttribute("userCmd", userManager.getUserById(id));
        return "editUser";
    }

    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public String addUser(ModelMap model) {
        model.addAttribute("userCmd", new User());
        return "addUser";
    }

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String processAddSubmit(@ModelAttribute("userCmd") User user,
            BindingResult result, SessionStatus status,
            HttpServletResponse response) throws IOException {

        userValidator.validate(user, result);

        if (result.hasErrors())
            return "addUser";

        userManager.insertUser(user);
        status.setComplete();

        return "redirect:/users";

    }

    @RequestMapping(value = "/update", method = RequestMethod.POST)
    public String processEditSubmit(@ModelAttribute("userCmd") User user,
            BindingResult result, SessionStatus status,
            HttpServletResponse response) throws IOException {

        userValidator.validate(user, result);

        if (result.hasErrors())
            return "editUser";

        // user contains zero ID and operation fails with org.hibernate.StaleStateException: 
        // Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
        userManager.updateUser(user);

        status.setComplete();

        return "redirect:/users";

    }

    @RequestMapping(value = "/delete/{id}", method = RequestMethod.POST)
    public String processDelete(@PathVariable int id,
            HttpServletResponse response) throws IOException {

        userManager.deleteUser(id);

        return "redirect:/users";

    }

}

In your jsp, you are mentioning disabled=true. 在你的jsp中,你提到disabled = true。 When you do this, the browser will not send this field value back to the server (You can verify this by Chrome Dev tools or Firebug plugin on FF). 执行此操作时,浏览器不会将此字段值发送回服务器(您可以通过Chrome Dev工具或FF上的Firebug插件验证)。 So in your controller, id field value is zero, because it is an integer primitive type and all instance primitives are initialized to default value. 所以在你的控制器中,id字段值为零,因为它是一个整数基元类型,所有实例基元都被初始化为默认值。

Why not use readOnly=true instead? 为什么不使用readOnly = true呢?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM