I trying to use a selectOneMenu ajax listener but its not working when my page receives parameters.
In my tests I used the same example shown in PrimeFaces ShowCase page, but my page also receives parameters by viewParam and viewAction.
The first time the selectOneMenu is changed the action listener is triggered, and then it stops working.
My page:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org /TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Facelet Title</title>
</h:head>
<f:metadata>
<f:viewParam name="id" value="#{dropdownViewBean.id}" required="true" />
<f:viewAction action="#{dropdownViewBean.init}" />
</f:metadata>
<h:body>
<h:form>
<p:growl id="msgs" showDetail="true" />
<p:panel header="Select a Location" style="margin-bottom:10px;">
<h:panelGrid columns="2" cellpadding="5">
<p:outputLabel for="country" value="Country: " />
<p:selectOneMenu id="country" value="#{dropdownViewBean.country}" style="width:150px">
<p:ajax listener="#{dropdownViewBean.onCountryChange}" update="city" />
<f:selectItem itemLabel="Select Country" itemValue="" noSelectionOption="true" />
<f:selectItems value="#{dropdownViewBean.countries}" />
</p:selectOneMenu>
<p:outputLabel for="city" value="City: " />
<p:selectOneMenu id="city" value="#{dropdownViewBean.city}" style="width:150px">
<f:selectItem itemLabel="Select City" itemValue="" noSelectionOption="true" />
<f:selectItems value="#{dropdownViewBean.cities}" />
</p:selectOneMenu>
</h:panelGrid>
<p:separator />
<p:commandButton value="Submit" update="msgs" actionListener="#{dropdownViewBean.displayLocation}" icon="ui-icon-check" />
</p:panel>
</h:form>
</h:body>
</html>
And the bean:
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
@Named(value = "dropdownViewBean")
@ViewScoped
public class DropdownViewBean implements Serializable {
private Map<String, Map<String, String>> data = new HashMap<String, Map<String, String>>();
private String country;
private String city;
private Map<String, String> countries;
private Map<String, String> cities;
private int id;
public DropdownViewBean() {
}
public void init() {
System.out.println("init id=" + id); // message is correctly shown when page starts
countries = new HashMap<String, String>();
countries.put("USA", "USA");
countries.put("Germany", "Germany");
countries.put("Brazil", "Brazil");
Map<String, String> map = new HashMap<String, String>();
map.put("New York", "New York");
map.put("San Francisco", "San Francisco");
map.put("Denver", "Denver");
data.put("USA", map);
map = new HashMap<String, String>();
map.put("Berlin", "Berlin");
map.put("Munich", "Munich");
map.put("Frankfurt", "Frankfurt");
data.put("Germany", map);
map = new HashMap<String, String>();
map.put("Sao Paolo", "Sao Paolo");
map.put("Rio de Janerio", "Rio de Janerio");
map.put("Salvador", "Salvador");
data.put("Brazil", map);
}
public Map<String, Map<String, String>> getData() {
return data;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public Map<String, String> getCountries() {
return countries;
}
public Map<String, String> getCities() {
return cities;
}
public void onCountryChange() {
System.out.println("change"); // message is shown only the first time the combo is changed
if (country != null && !country.equals("")) {
cities = data.get(country);
} else {
cities = new HashMap<String, String>();
}
}
public void displayLocation() {
FacesMessage msg;
if (city != null && country != null) {
msg = new FacesMessage("Selected", city + " of " + country);
} else {
msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid", "City is not selected.");
}
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
Important:
If I took out the metadata, viewParam and viewAction tags and mark the init() method with @PostConstruct then the sample works perfectly, but I need the page parameter.
I ask your help to solve it.
I had the same problem as you.
Replace the tag
<f:viewParam name="id" value="#{dropdownViewBean.id}" required="true" />
With
<f:viewParam name="id" value="#{dropdownViewBean.id}"/>
Unfortunately I don't have an explanation about this Bug