Why is this <p:selectManyMenu> not working? (getAllDatasourceGroups() is not even called once)

284 Views Asked by At

My problem is about this primefaces tag:

<p:selectManyCheckbox id="datasourceGroup" value="#{sessionBean.datasourceGroups}" converter="datasourceGroupConverter">
  <f:selectItems value="#{sesionBean.getAllDatasourceGroups()}" var="group" itemLabel="#{group.toString()}" itemValue="#{group}" />  
</p:selectManyCheckbox>                         

It does not render any visible output (checkboxes) at all. From logging output i know that the 'sessionBean.getAllDatasourceGroups()' method is not even called once during page refresh. only the 'sessionBean.getDatasourcegroups()' getter for the 'datasourceGroups' property is called once.

And i can't figure out what the problem is. I have very similar usecases of <p:selectManyMenu> and <p:selectOneMenu> on the same page and they work fine. So i have a basic understanding of how this works...or so i thought :-)

here are the other relevant parts of the code for reference:

SessionBean:

@ManagedBean
@SessionScoped
public class SessionBean implements Serializable {

    private List<DatasourceGroup> datasourceGroups = new ArrayList<>();

    public List<DatasourceGroup> getDatasourceGroups() {
        return datasourceGroups;
    }

    public void setDatasourceGroups(List<DatasourceGroup> datasourceGroups) {
        this.datasourceGroups = datasourceGroups;
    }

    public List<DatasourceGroup> getAllDatasourceGroups() {
        List<DatasourceGroup> list = Arrays.asList(DatasourceGroup.values());
        return list;
    }
}

DatasourceGroup Enum:

public enum DatasourceGroup {

    KUNDEN (Permission.ZugriffKunden),
    INKASSO (Permission.ZugriffInkasso),
    INTERESSENTEN (Permission.ZugriffInteressenten),
    WARN (Permission.ZugriffWarnadressen);

    private Permission permissionNeeded;

    DatasourceGroup(Permission permission) {
        this.permissionNeeded=permission;
    }

    public Permission getPermissionNeeded() {
        return permissionNeeded;
    }

}

And the DatasourceGroupConverter:

@FacesConverter("datasourceGroupConverter")
public class DatasourceGroupConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String value) {

        if (Toolbox.isNullOrEmpty(value))
            return null;

        try {
            return DatasourceGroup.valueOf(value);
        } catch (IllegalArgumentException e) {
            throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error:",
                    "'" + value + "' is not a valid datasource group name"));
        }
    }

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object object) {
        if(object != null && object instanceof DatasourceGroup) {
            return ((DatasourceGroup)object).toString();
        }
        return null;
    }

}

I'm using primefaces 6.0 by the way.

0

There are 0 best solutions below