有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpring表单从对象中选择枚举

我正在制作一个表单来编辑用户,每个用户都有多个角色(基于SpringSecurity)。问题是选择选项没有预先选择用户的对应角色

使用者

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>

我确信问题来自“userRoles”,它是一种与“roles”不同类型的Set。还有另一种制作表单的方法吗

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;
}

共 (2) 个答案

  1. # 1 楼答案

    我有这个“解决方案”,但我一直在寻找春天能自动完成的事情

            ...
            <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>
            ...
    
  2. # 2 楼答案

    在你的角色enum中有以下代码

    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()
    

    这应该能很好地解决你的问题