我正在使用 selectmanycheckbox 编辑数据库中表的条目(在这种情况下为用户)以创建如下:
userid | system
1 4
2 4
2 5
2 6
3 4
...
像这样。它工作得很好。问题是,selectmanycheckbox 中的所有系统都是高亮显示,即使所选用户在系统列表中只有少数可用选项。
详细地:
用户 x 在数据库中有 x 个系统在应用程序中,我设置了 x 个系统,我调用列表来为该用户选择系统,它突出显示所有系统,而不仅仅是该用户的系统,因此看起来用户在列表中拥有所有系统.
用户实体:
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "users_system_groups", joinColumns = {
@JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = {
@JoinColumn(name = "system_group_id", referencedColumnName = "id") })
private List<SystemGroup> systemGroups = new ArrayList<>();
html:
<p:selectManyCheckbox layout="pageDirection" value="#{userEditBoundary.user.systemGroups}"
converter="#{systemGroupConverter}">
<f:selectItems value="#{systemBoundary.systemGroups}" var="group" itemLabel="#{group.name}"
itemValue="#{group}"/>
<p:ajax listener="#{userEditBoundary.save}"/>
</p:selectManyCheckbox>
系统边界
public List<SystemGroup> getSystemGroups() {
LinkedList<SystemGroup> result = new LinkedList<>();
for (SystemGroup systemGroup : systemGroupStore.findAll()) {
if (user.getSubject().isPermitted(LhtPermission.forSystemGroupReadAccess(systemGroup)))
result.add(systemGroup);
}
return result;
}
系统组转换器
@Inject
SystemGroupStore systemGroupStore;
@Override public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String string) {
SystemGroup systemGroup = systemGroupStore.findOne(Long.parseLong(string));
return systemGroup;
}
@Override public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object object) {
if (!(object instanceof SystemGroup))
throw new IllegalArgumentException(
"Object has to be from type SystemGroup, " + object.getClass().getName() + " given!");
SystemGroup systemGroup = (SystemGroup) object;
return String.valueOf(systemGroup.getId());
}
我没有进一步的想法来解决这个问题,我不知道为什么要检查所有选项。