1 Reply Latest reply on Nov 4, 2007 9:01 AM by elnino

    Another h:selectOneMenu and valueChangeListener problem...

    elnino

      Hello,

      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 !