Spring和Hibernate:如何使用jsp和复选框修改用户权限

时间:2010-10-20 17:42:37

标签: hibernate spring jsp spring-mvc

我正在使用spring security并有一个管理jsp页面来编辑用户详细信息。我希望能够在此页面上授予或撤销权限。以下复选框标记用于显示给定用户的现有权限:

<form:checkboxes path="authorities" items="${roles}" delimiter="<br />" />

其中authorites是用户实体的属性,${roles}是模型属性,是所有可能权限的列表。

这适用于GET:如果我在此页面中查询用户,则会列出所有权限,并检查用户拥有的权限。

问题是,如果我对用户的权限进行更改(添加新权限或删除现有权限)并尝试保存,我会收到以下错误:

HibernateSystemException: IllegalArgumentException occurred calling getter of com.ebisent.domain.Authority.id

我可以在调试器中看到Hibernate将Set<GrantedAuthority> authorities包裹在org.hibernate.collection.PersistentSet中。 Hibernate不会将新权限添加到我的权限集。相反,它添加一个包含权限的字符串值的新Set。结果是我的权限HashSet(应该只包含GrantedAuthority元素)现在包含LinkedHashSets,其中包含我正在添加的权限的字符串表示。

以下是User.authorities的getter和setter:

public Set<GrantedAuthority> getAuthorities() {
    return authorities;
}
public void setAuthorities(Set<GrantedAuthority> authorities) {
    this.authorities = authorities;
}

我做错了什么?

1 个答案:

答案 0 :(得分:0)

这是HTML表单的固有限制 - 因为HTML表单中的字段值表示为字符串,您需要指示Spring如何从字符串表示重构GrantedAuthority。它可以按如下方式完成:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(GrantedAuthority.class, new PropertyEditorSupport() {
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            GrantedAuthority value = ...;
            setValue(value);
        }
    });
}