javax.faces.FacesException: Target model Type is no a Collection or Array

10,548
javax.faces.FacesException: Target model Type is no a Collection or Array
    at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel(MenuRenderer.java:388)

This exception indicates that you've an UISelectMany component in the view such as <h:selectManyMenu> or <h:selectManyListbox> whose value is not been bound to a collection or array. This is not right. Its value must be bound to a collection (like List<Entity>) or array (like Entity[]), because the component can retrieve multiple submitted values.

Here's a kickoff example of how a proper <h:selectManyMenu> look like, assuming that you're using String typed items:

<h:selectManyMenu value="#{bean.selectedItems}">
    <f:selectItems value="#{bean.availableItems}" />
</h:selectManyMenu>
<h:commandButton value="submit" action="#{bean.submit}" />

with

private List<String> selectedItems; // Note: List<String> and thus NOT String!
private List<String> availableItems;

@PostConstruct
public void init() {
    availableItems = Arrays.asList("one", "two", "three", "four", "five");
}

public void submit() {
    System.out.println("Selected items: " + selectedItems);
}

See also:

Share:
10,548

Related videos on Youtube

Qadir Hussain
Author by

Qadir Hussain

Java/Java EE and Python Developer Technologies: Java/Java EE, Spring, AngularJS, Material Design, JSF(Primefaces, Richfaces), JSP, Servlet. Frameworks: JSF, Spring, Struts, Hibernate Database: MySQL, PostgreSQL, Oracle NoSQL Database: Cassandra Web/Application Server(s): Tomcat, Wildfly, Weblogic

Updated on August 15, 2022

Comments

  • Qadir Hussain
    Qadir Hussain over 1 year

    When submitting a JSF form, I'm getting the below exception:

    Caused by: javax.faces.FacesException: Target model Type is no a Collection or Array 
        at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel(MenuRenderer.java:388) [:2.0.3-] 
        at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValue(MenuRenderer.java:125) [:2.0.3-] 
        at com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:311) [:2.0.3-] 
        at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1023) [:2.0.3-]     at javax.faces.component.UIInput.validate(UIInput.java:953) [:2.0.3-] 
        at javax.faces.component.UIInput.executeValidate(UIInput.java:1204) [:2.0.3-] 
        at javax.faces.component.UIInput.processValidators(UIInput.java:693) [:2.0.3-] 
        at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1081) [:2.0.3-] 
        at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1081) [:2.0.3-] 
        at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1081) [:2.0.3-] 
        at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1081) [:2.0.3-] 
        at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1081) [:2.0.3-] 
        at javax.faces.component.UIForm.processValidators(UIForm.java:240) [:2.0.3-] 
        at org.ajax4jsf.component.AjaxViewRoot$3.invokeContextCallback(AjaxViewRoot.java:439) [:3.3.1.GA] 
        at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:238) [:3.3.1.GA] 
        at org.ajax4jsf.component.AjaxViewRoot.processValidators(AjaxViewRoot.java:455) [:3.3.1.GA] 
        at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:72) [:2.0.3-]   at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) [:2.0.3-] 
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114) [:2.0.3-] 
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308) [:2.0.3-]
        ... 42 more
    

    How is this caused and how can I solve it?