【问题标题】:Spring Binding List<Object> to Form:checkboxesSpring 绑定 List<Object> 到 Form:checkboxes
【发布时间】:2011-11-17 07:01:12
【问题描述】:

我似乎无法让我的表单绑定到复选框控件。我在这里阅读了很多帖子并尝试了一些技术,但没有运气。也许换一双眼睛会有所帮助。

我的控制器:

public String editAccount(@RequestParam("id") String id, Model model) {
    model.addAttribute("account", accountService.getAccount(id));
    model.addAttribute("allRoles", roleService.getRoles());
    return EDIT_ACCOUNT;
}

我的jsp:

<form:form action="" modelAttribute="account">
<form:checkboxes items="${allRoles}" path="roles" itemLabel="name" itemValue="id" delimiter="<br/>"/>
</form>

生成的html:

<span><input id="roles1" name="roles" type="checkbox" value="1"/><label for="roles1">User</label></span><span><br/><input id="roles2" name="roles" type="checkbox" value="2"/><label for="roles2">Admin</label></span><span><br/><input id="roles3" name="roles" type="checkbox" value="3"/><label for="roles3">SuperAdmin</label></span<input type="hidden" name="_roles" value="on"/>

我为每个循环(未显示)使用了第二个,以确保模型对象包含角色。确实如此,但是没有选中任何复选框,并且当我提交角色对象时,它始终为空。有人可以告诉我我缺少什么吗?

谢谢

编辑

抱歉,刚刚意识到查看帐户和角色对象可能会有所帮助:

public class Account {

    private String username, firstName, lastName, email;
    private List<Role> roles;

    @NotNull
    @Size(min = 1, max = 50)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @NotNull
    @Size(min = 1, max = 50)
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @NotNull
    @Size(min = 1, max = 50)
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @NotNull
    @Size(min = 6, max = 50)
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    public String toString() {
        return ReflectionToStringBuilder.toString(this);
    }

}

public class Role {

private int id;
private String name;

public Role() {}

public Role(int id, String name) {
    this.id = id;
    this.name = name;
}

public int getId() {
    return id;
}

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

@NotNull
@Size(min = 1, max = 50)
public String getName() {
    return name;
}

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

}

编辑#2

控制器发布方法

@RequestMapping(value = "edit", method = RequestMethod.POST)
public String updateAccount(@RequestParam("id") String id, @ModelAttribute("account") @Valid AccountEditForm form, BindingResult result) {
    System.out.println("FORM VALUES AFTER: " + form);
    return (result.hasErrors() ? EDIT_ACCOUNT : ACCOUNT_REDIRECT);
}

AccountEditForm 是表单支持对象。当我执行 GET 时,我会抓取一个 Account 对象并将值传递给 AccountEditForm,然后再显示屏幕。为了清楚起见,我将附上 AccountEditForm。它与帐户对象非常相似。我只是碰巧将我的表单对象与我的模型对象分开。

public class AccountEditForm {

    private String username, firstName, lastName, email;
    private List<Role> roles = new ArrayList<Role>();

    @NotNull
    @Size(min = 1, max = 50)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @NotNull
    @Size(min = 1, max = 50)
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @NotNull
    @Size(min = 1, max = 50)
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @NotNull
    @Size(min = 6, max = 50)
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    public String toString() {
        return ReflectionToStringBuilder.toString(this);
    }

}

EDIT #3 角色属性编辑器

public class RolePropertyEditor extends PropertyEditorSupport {

    private Map<Integer, Role> roleMap = new HashMap<Integer, Role>();

    public RolePropertyEditor(List<Role> roleList) {
        for (Role r : roleList) roleMap.put(r.getId(), r);
    }

    public void setAsText(String incomingId) {
        Role role = roleMap.get(incomingId);
        System.out.println("PROPERTY EDITOR ROLE " + role);
        setValue(role);
    }

    public String getAsText() {
        System.out.println("PROPERTY EDITOR ID " + ((Role)getValue()).getId());
        return String.valueOf(((Role)getValue()).getId());
    }
}

在我的控制器中定义如下:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.setAllowedFields(new String[] {
            "username", "password", "confirmPassword", "firstName", "lastName", "email", "acceptTerms", "currentPassword"
    });
    binder.registerCustomEditor(Role.class, new RolePropertyEditor(roleService.getRoles()));
}

编辑 #4 新的 ProeprtyEditor

public class SecurityRolePropertyEditor extends PropertyEditorSupport {

    private RoleService roleService;

    public SecurityRolePropertyEditor(RoleService roleService) {
        this.roleService = roleService;
    }

    public void setAsText(final String name) {
        Role role = roleService.getRoleByName(name);
        setValue(role);
    }
}

【问题讨论】:

    标签: java spring binding checkbox


    【解决方案1】:

    为你的 Roles 实体添加一个 equals 方法。

    有关更多详细信息,请参阅此answer (Spring MVC Pre Populate Checkboxes): of a similar question。

    【讨论】:

    • 感谢您的回复。我在我的 Role 对象中添加了 equals,现在当我查看屏幕时,复选框已正确填充,但是当我进行更改或提交时,绑定到表单的帐户对象的角色属性始终为空。
    • @blong824 是Role对象没有提交、没有填充到Account对象或者没有保存的问题吗?
    • 我删除了所有要保存的代码,只是在 post 方法中添加了一个 print 语句。角色对象始终为空。所以没有填充到 Account 对象中。
    • @blong824: 你能添加post-method吗?
    • @blong824: 你有注册的 PropertyEditor 或转换器来将 Role 的 id 转换为其角色对象吗?
    【解决方案2】:

    您的实体上似乎缺少实现 equals 和 hashCode 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 2015-09-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多