我制作表单来编辑用户,每个用户都有多个角色(基于Spring Security)。问题是没有使用用户的通讯角色预选选择选项。
用户
public class User implements UserDetails {
...
private Set<UserRole> userRoles = new HashSet<>(0);
...
}
角色
public class UserRole implements GrantedAuthority {
...
private Role role; //enum {ROLE_ADMIN, ROLE_USER,...}
...
}
表格
<form:fomr commandName="user">
<form:input path="username" />
...
<form:select multiple="true" path="userRoles" itemValue="role">
<form:options items="${roles}"/>
</form:select>
...
</form:form>
我确定问题来自&#34; userRoles&#34;,它是一个不同类型的Set
&#34;角色&#34;。还有另一种方法来制作表格吗?
PS:items=${roles} == Roles.values()
编辑:
User user = getUserById(id);
model.addAttribute("newUser", user);
@Transactional
public User getUserById(int id) {
Session session = sessionFactory.getCurrentSession();
User user = (User) session.get(User.class, id);
if (user != null) {
user.getUserRoles().size();
}
return user;
}
答案 0 :(得分:0)
在你的角色枚举中有以下代码;
public enum Role {
private static Map<Integer, String> idNameMap = new HashMap<Integer, String>();
static {
for(Role role:Role.values()) {
idNameMap.put(role.ordinal(), role.name());
}
}
public static Map<Integer, String> getIdNameMap() {
return idNameMap;
}
}
现在在你的控制器代码而不是这样做
items=${roles} == Roles.values()
做
items=${roles} == Roles.getIdNameMap()
理想情况下,这应该可以解决您的问题。
答案 1 :(得分:0)
我有这个&#34;解决方案&#34;,但我正在寻找春天自动做的事情
...
<form:select multiple="true" path="userRoles" itemValue="role">
<c:forEach items="${roles}" var="role">
<c:set var="selected" value="false" />
<c:forEach items="${newUser.userRoles}" var="userRole">
<c:if test="${fn:containsIgnoreCase(userRole, role)}">
<form:option value="${role}" selected="true"/>
<c:set var="selected" value="true" />
</c:if>
</c:forEach>
<c:if test="${selected eq false}">
<form:option value="${role}"/>
</c:if>
</c:forEach>
</form:select>
...