selectManyCheckbox:转换后不会调用Action

时间:2014-04-25 13:31:07

标签: java jpa jsf-2 primefaces glassfish

我想显示所有用户角色als复选框,以便将可用角色分配给一个用户。 因此,我创建了一个名为userDetail.xhtml的页面来编辑用户。

<h:form id="form" styleClass="dialog_content">
    <p:panelGrid columns="4" styleClass="noBorders">
        <p:outputLabel value="Username"/>
        <p:inputText id="input_username" value="#{userPM.userName}"/>
        <p:outputLabel value=""/>
        <p:message for="input_username"/>

        <p:outputLabel value="Vorname"/>
        <p:inputText value="#{userPM.vorname}"/>
        <p:outputLabel value="Nachname"/>
        <p:inputText value="#{userPM.nachname}"/>

        <p:outputLabel value="Rollen"/>
        <p:selectManyCheckbox value="#{userPM.userRoles}" converter="roleConverter">
            <f:selectItems value="#{rolePM.getAllRoles()}" var="role" itemLabel="#{role.bezeichnung}" itemValue="#{role}" />
        </p:selectManyCheckbox>
        <p:outputLabel />
        <p:outputLabel />

        <p:outputLabel value="Aktiv"/>
        <p:selectBooleanCheckbox value="#{userPM.active}"/>
        <h:outputText value="not selected" rendered="#{!userPM.active}"/>
        <p:outputLabel value=""/>
    </p:panelGrid>
    <p:separator/>
    <p:panelGrid style="width: 100%" styleClass="noBorders">
        <p:row>
            <p:column style="text-align: left;">
                <p:commandButton icon="ui-icon-disk" value="Speichern" action="#{userPM.editUser()}"/>
            </p:column>
            <p:column style="text-align: right;">
                <p:commandButton icon="ui-icon-closethick" value="Abbrechen" actionListener="#{userPMSuche.abortEditUser()}"/>
            </p:column>
        </p:row>
    </p:panelGrid>
</h:form>

为了处理编辑页面,我创建了以下模型。 lastUser对象将包含应编辑的用户。

@ManagedBean
@SessionScoped
public class UserPM implements Serializable {

    private static final long serialVersionUID = -5604907919976613472L;

    private String userName;
    private String vorname;
    private String nachname;
    private boolean active;
    private List<Role> userRoles = new ArrayList<Role>();

    private User lastUser;

    @EJB
    UserService userService;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getVorname() {
        return vorname;
    }

    public void setVorname(String vorname) {
        this.vorname = vorname;
    }

    public String getNachname() {
        return nachname;
    }

    public List<Role> getUserRoles() {
        return this.userRoles;
    }

    public void setNachname(String nachname) {
        this.nachname = nachname;
    }

    public boolean getActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }

    public void setLastUser(User user) {
        this.lastUser = user;
    }

    public void setUserRoles(List<Role> userRoles) {
        this.userRoles = userRoles;
    }

    public User getLastUser() {
        return this.lastUser;
    }

    public void editUser() {
        lastUser.setUsername(userName);
        lastUser.setVorname(vorname);
        lastUser.setNachname(nachname);
        lastUser.setUser_roles(userRoles);
        lastUser.setActive(active);
        userService.mergeUser(lastUser);
        RequestContext.getCurrentInstance().closeDialog("userDetail");
    }
}

我还为角色创建了一个转换器:

@FacesConverter("roleConverter")
public class RoleConverter implements Converter {

    @EJB
    private RoleService roleService;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String string) {
        return roleService.getRoleByID(Integer.parseInt(string));
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object object) {
        if (object instanceof Role) {
            return String.valueOf(((Role) object).getId());
        } else {
            return "";
        }
    }
}

正确显示所有可能的角色。在页面加载时调用getAsString()方法,并在单击Save-Button(= Speichern)时调用getAsObject()方法。 但是editUser()方法设置为保存按钮后面的操作,在转换器getAsObject()方法之后不会被调用。

我是对的,单击保存按钮后应该在转换器后调用editUser()方法吗?我还尝试使用actionListener代替action。 我的glassfish控制台上没有任何例外!该按钮根本不会调用该动作。

目的是通过单击复选框为特定用户选择角色。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您无需创建自己的converter

如果您想要generic converter,那么Omnifaces SelectItemsConverter就是最好的。

Omni Faces Converter

如果您不想使用Omnifaces,请使用以下通用转换器

import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
import java.util.WeakHashMap;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

@FacesConverter(value = "entityConverter")
public class EntityConverter implements Converter {

    private static Map<Object, String> entities = new WeakHashMap<Object, String>();

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object entity) {
        synchronized (entities) {
            if (!entities.containsKey(entity)) {
                String uuid = UUID.randomUUID().toString();
                entities.put(entity, uuid);
                return uuid;
            } else {
                return entities.get(entity);
            }
        }
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String uuid) {
        for (Entry<Object, String> entry : entities.entrySet()) {
            if (entry.getValue().equals(uuid)) {
                return entry.getKey();
            }
        }
        return null;
    }

}