Ajax-chained selectManyListBoxes
maciekpazur Mar 26, 2009 9:34 PMHello.
I do realize that the problem of ajax-chained selects has been discussed a number of times.
But I tried to follow all the advice and didn't manage to make my application work.
I am trying to implement searching UI for my application (issue management system).
User can select some projects in selectManyListBox.
                    
<a4j:region id="projectsPanel">
     <h:selectManyListbox value="#{searchIssue.selectedProjects}" size="5">
          <s:selectItems value="#{allProjects.resultList}" var="proj"
               label="#{proj.name}" />
          <s:convertEntity />
          <a4j:support event="onchange"
               action="#{searchIssue.projectsSelected()}" reRender="modulesPanel" />
     </h:selectManyListbox>
</a4j:region>Then relevant modules should appear in another selectManyListbox. 
<a4j:outputPanel id="modulesPanel">
     <h:selectManyListbox value="#{searchIssue.selectedModules}" size="5">
          <s:selectItems value="#{searchIssue.availableModules}" var="module"
               label="#{module.name}" />
          <s:convertEntity />
     </h:selectManyListbox>
</a4j:outputPanel>The view is supported with a backing bean SearchIssuesAction:
@Scope(CONVERSATION)
@Name("searchIssue")
@Stateful
public class SearchIssuesAction implements SearchIssues {
@In(create = true, value = "#{allProjects.resultList}")
@SuppressWarnings(value = { "unused" })
private List<Project> allProjects;
private List<Project> selectedProjects;
private List<Module> selectedModules;
private List<Module> availableModules;
(...)
     
public void projectsSelected() {
     List<Module> available = new LinkedList<Module>();
     if (selectedProjects != null)
          for (Project project : selectedProjects) {
               available.addAll(project.getModules());
          }
     availableModules = available;
}
(...getters and setter for selectedProjects, selectedModules, availableModules...)
I run into a number of problems
The only way to display the page, without getting an error
Expected a child component type of UISelectItem/UISelectItems for component type javax.faces.SelectMany(j_id57). Found null.
 is to render the modules select only if availableModules list size is greater than 0.
 I want this select to be empty unless any projects with modules have been selected.
If I make the above-mentioned workaround, the modules appear on the list, but
  when I submit the form it turns out that selectedModules is null.
I would greatly appreciate any help.