Another h:selectOneMenu and valueChangeListener problem...
elnino Nov 4, 2007 8:56 AMHello,
I am relatively new with JBoss technologies; I spent a lot of time reading books and posts but I spent several days on a very simple thing; others people have already explain the same problem on the forum but the proposed solutions are not working for me.
My post is quite long cause I prefer giving you a complete presentation of my problem.
I'am using
jBoss Seam 2.0.0.CR2
with jboss-4.2.1.GA
I will take a simple example :
I have:
- a continent entity
- a country entity
Of course, continent contains serveral countries and a country is attached to a continent :
@Entity @Name("continent") @Table(name = "Continents") public class Continent extends PersistentEntity implements Serializable { private static final long serialVersionUID = 1L; private long id; private Set<Country> countries; private String name; public Continent() { } public Continent(String name) { this.name = name; } @Id @GeneratedValue public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToMany public Set<Country> getCountries() { return countries; } public void setCountries(Set<Country> countries) { this.countries = countries; }
@Entity @Name("country") @Table(name="Countries") public class Country extends Location implements Serializable { private static final long serialVersionUID = 1L; private long id; private Continent continent; private Set<Region> regions; @Id @GeneratedValue public long getId() { return id; } public void setId(long id) { this.id = id; } @OneToMany public Set<Region> getRegions() { return regions; } public void setRegions(Set<Region> regions) { this.regions = regions; } @ManyToOne public Continent getContinent() { return continent; } public void setContinent(Continent continent) { this.continent = continent; }
Now I have a XHTML page with <h:selectOneMenu items.
The first list all the continents, and on the selection of a continent, I would like to enable the country select box and refreshing it with the countries located in the selected continent.
I read a lot of documents but I can't manage to get a response on value selection.
I have the xHTML form :
<h:form id="creationForm"> <h:outputText value="Continent: " /> <h:outputText value="No continent" rendered="#{creationAction.getNumberOfPossibleContinents()==0}" /> <h:selectOneMenu value="#{creationAction.selectedContinent}" valueChangeListener="#{creationAction.continentChangeEvent}" onchange="this.form.submit()" rendered="#{creationAction.getNumberOfPossibleContinents()>0}"> <s:selectItems value="#{creationAction.getPossibleContinentsList()}" var="selectedContinent" noSelectionLabel="Please Select..." /> <s:convertEntity /> </h:selectOneMenu> </h:form>
creationAction is defines like this
@Stateful @Name("creationAction") @Scope(ScopeType.SESSION) public class creationAction implements ICreation { private Continent selectedContinent; private List<Continent> possibleContinentsList; @PersistenceContext(type = EXTENDED) private EntityManager entityManager; public void cancelCreation() { } @Remove @End public void confirmCreation() { System.out.println("CONFIRM"); } @SuppressWarnings("unchecked") public List<Continent> getPossibleContinentsList() { possibleContinentsList = entityManager .createQuery("from Continent row").getResultList(); return possibleContinentsList; } public void addContinent(Continent continent) { } public Continent getSelectedContinent() { return null; } public void setSelectedContinent(Continent continent) { System.out.println("Set..."); } public int getNumberOfPossibleContinents() { int result = 0; if (possibleContinentsList != null) { result = possibleContinentsList.size(); } else { result = getPossibleContinentsList().size(); } return result; } public void continentChangeEvent(ValueChangeEvent event) { System.out.println("Event : " + event); System.out.println("New value : " + event.getNewValue()); }
With the interface :
@Local public interface ICreation { public void confirmCreation(); public void cancelCreation(); public List<Continent> getPossibleContinentsList(); public void addContinent(Continent continent); public Continent getSelectedContinent(); public void setSelectedContinent(Continent continent); public int getNumberOfPossibleContinents(); public void continentChangeEvent(ValueChangeEvent event);
The continent list is displayed but continentChangeEvent method is never called !
In the debug console (when I select a continent ...) :
13:52:22,098 INFO [lifecycle] WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=creationForm:j_id19[severity=(ERROR 2), summary=(value is not valid), detail=(value is not valid)]
Any ideas ?
I'am of course free for answer to all your questions ?
Thanks for your help !