我想显示所有用户角色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控制台上没有任何例外!该按钮根本不会调用该动作。
目的是通过单击复选框为特定用户选择角色。
感谢您的帮助!
答案 0 :(得分:0)
您无需创建自己的converter
。
如果您想要generic converter
,那么Omnifaces SelectItemsConverter
就是最好的。
如果您不想使用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;
}
}