• cdi
  • components
  • contexts
  • converters
  • eventlisteners
  • exceptionhandlers
  • facesviews
  • filters
  • functions
  • managedbeans
  • push
  • renderkits
  • resourcehandlers
  • scripts
  • servlets
  • taghandlers
  • utils
  • validators
  • viewhandlers
-
  • GenericEnumConverter
  • ListConverter
  • ListIndexConverter
  • SelectItemsConverter
  • SelectItemsIndexConverter
  • ValueChangeConverter

The omnifaces.GenericEnumConverter is intended for use in UISelectMany components whose value is been bound to a List<E> property where E is an enum. Even though JSF has already a built-in EnumConverter, this doesn't work for a List<E> property as the generic type information E is lost during runtime. The list would be filled with unconverted String values instead which may in turn cause ClassCastException during postprocessing in the business logic.

This can be solved by using a E[] property instead of List<E> (e.g. Role[] in case of a Role enum). If this is however is not an option due to some design restrictions (e.g. JPA @ElementCollection, etc), then you'd need to create an explicit converter for the enum type like follows:

@FacesConverter("roleConverter")
public class RoleConverter extends EnumConverter {
    public RoleConverter() {
        super(Role.class);
    }
}
<h:selectManyCheckbox value="#{bean.selectedRoles}" converter="roleConverter">
    <f:selectItems value="#{bean.availableRoles}" />
</h:selectManyCheckbox>

However, creating a new converter for every single enum type, only and only for use in UISelectMany with a List<E> property, may be a bit clumsy. This generic enum converter is intended to remove the need to create a new enum converter every time.

Usage

This converter is available by converter ID omnifaces.GenericEnumConverter. Just specify it in the converter attribute of the multi-selection component holding <f:selectItems>. example:

<h:selectManyCheckbox value="#{bean.selectedEnums}" converter="omnifaces.GenericEnumConverter">
    <f:selectItems value="#{bean.availableEnums}" />
</h:selectManyCheckbox>

See also:
Use enum in <h:selectManyCheckbox>

Demo

With ExampleEnum[] - works fine

Selected:


With List<ExampleEnum> - wrong type has been set!

Selected:


With List<ExampleEnum> and omnifaces.GenericEnumConverter - works fine

Selected:

Demo source code
<o:importConstants type="org.omnifaces.showcase.model.ExampleEnum" />
    
<h3>With <code>ExampleEnum[]</code> - works fine</h3>
<h:form>
    <h:selectManyCheckbox value="#{genericEnumBean.enumArray}">
        <f:selectItems value="#{ExampleEnum}" />
        <f:ajax render="showSelected" />
    </h:selectManyCheckbox>
    <p>Selected:
        <h:panelGroup id="showSelected">
            <ui:repeat value="#{genericEnumBean.enumArray}" var="item" varStatus="loop">
                #{item} (#{item['class'].simpleName})#{loop.last ? '' : ','}
            </ui:repeat>
        </h:panelGroup>
    </p>
</h:form>

<hr />

<h3>With <code>List&lt;ExampleEnum&gt;</code> - wrong type has been set!</h3>
<h:form>
    <h:selectManyCheckbox value="#{genericEnumBean.enumList}">
        <f:selectItems value="#{ExampleEnum}" />
        <f:ajax render="showSelected" />
    </h:selectManyCheckbox>
    <p>Selected:
        <h:panelGroup id="showSelected">
            <ui:repeat value="#{genericEnumBean.enumList}" var="item" varStatus="loop">
                #{item} (#{item['class'].simpleName})#{loop.last ? '' : ','}
            </ui:repeat>
        </h:panelGroup>
    </p>
</h:form>

<hr />

<h3>With <code>List&lt;ExampleEnum&gt;</code> and <code>omnifaces.GenericEnumConverter</code> - works fine</h3>
<h:form>
    <h:selectManyCheckbox value="#{genericEnumBean.enumListConverted}" converter="omnifaces.GenericEnumConverter">
        <f:selectItems value="#{ExampleEnum}" />
        <f:ajax render="showSelected" />
    </h:selectManyCheckbox>
    <p>Selected:
        <h:panelGroup id="showSelected">
            <ui:repeat value="#{genericEnumBean.enumListConverted}" var="item" varStatus="loop">
                #{item} (#{item['class'].simpleName})#{loop.last ? '' : ','}
            </ui:repeat>
        </h:panelGroup>
    </p>
</h:form>
Documentation & Sources