4 Replies Latest reply on Mar 19, 2007 3:57 PM by Pete Muir

    selectManyListbox and SelectItem error

    jbosskiki Newbie

      Hi,
      I'm trying to use two selectManyListBox to assign a list of roles to a user.

      <h:selectManyListbox value="#{rolemanager.source}" converter="#{rolemanager.converter}" size="5">
       <f:selectItems value="#{rolemanager.items}" />
       </h:selectManyListbox>
      
       <h:commandButton value="add" action="#{rolemanager.add}" />
       <h:commandButton value="remove" action="#{rolemanager.remove}" />
      
       <h:selectManyListbox value="#{rolemanager.selected}" converter="#{rolemanager.converter}" size="5">
       <f:selectItems value="#{rolemanager.destination}" />
       </h:selectManyListbox>
      


      when I click on "Add", the list "source" in role manager is a list of Role and not a list of SelectItem, I'd like to know if it's a normal behaviour... I expect to have a List of SelectItem...
      the Complte code is

      RoleManager.java
      @Stateful
      @Scope(SESSION)
      @Name("rolemanager")
      public class RoleManagerBean implements RoleManager {
      
       @In(value="agaetisDatabase")
       private EntityManager em;
      
       @EJB
       private CompanyFacade company;
      
       private List<Role> roles;
      
       private List<SelectItem> items;
      
       private List<SelectItem> source=new ArrayList<SelectItem>();
      
       private List<SelectItem> destination=new ArrayList<SelectItem>();
      
       private List<SelectItem> selected=new ArrayList<SelectItem>();
      
       @Create
       public void loadData() {
       roles = company.findAllRoles(em);
      
       items=new ArrayList<SelectItem>(roles.size());
       for(Role role : roles)
       items.add(new SelectItem(role, role.getRole()));
       }
      
       public List<Role> getRoles() {
       return roles;
       }
      
       public Converter getConverter() {
      
       return new Converter(){
       public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
       if(value==null)
       return null;
      
       for(Role role : roles)
       if(role.getRole().equals(value))
       return role;
       return null;
       }
       public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException {
       return value==null ? null : ((Role)value).getRole();
       }
       };
       }
      
       public List<SelectItem> getItems() {
       return items;
       }
      
       public void setItems(List<SelectItem> items) {
       this.items = items;
       }
      
       public List<SelectItem> getDestination() {
       return destination;
       }
      
       public void setDestination(List<SelectItem> destination) {
       this.destination=destination;
       }
      
       public List<SelectItem> getSource() {
       return source;
       }
      
       public void setSource(List<SelectItem> source) {
       this.source=source;
       }
      
       public void setSelected(List<SelectItem> selected) {
       this.selected = selected;
       }
      
       public List<SelectItem> getSelected() {
       return selected;
       }
      
       public void add() {
       destination.addAll(source);
       source.clear();
       }
      
       public void remove() {
       source.addAll(destination);
       destination.clear();
       }
      
       @Destroy
       @Remove
       public void destroy() {
       }
      
       public void processValueChange(ValueChangeEvent event) throws AbortProcessingException {
       System.out.println(event);
       }
      }
      


      Role.java
      @Entity
      @Table
      @Scope(SESSION)
      @NamedQueries({@NamedQuery(name = MappedQueries.ROLE_QUERY_FIND_BY_ROLE, query = "select r from Role r where r.role=:role") })
      public class Role implements java.io.Serializable {
      
       private static final long serialVersionUID = 2;
      
       @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
       @Column(precision = 3, scale = 0)
       private short idrole;
      
       @NotNull
       @Length(max=70)
       @Column(unique = true, nullable = false, length = 70)
       private String role;
      
       @Length(max=200)
       @Column(length = 200)
       private String description;
      
       @ManyToMany(mappedBy = "roles")
       private List<User> users;
      
       public Role() {
       }
      
       public Role(String role) {
       this.role = role;
       }
      
       public Role(String role, String description) {
       this(role);
       this.description = description;
       }
      
       public short getIdrole() {
       return idrole;
       }
      
       public void setIdrole(short idrole) {
       this.idrole = idrole;
       }
      
       public String getRole() {
       return role;
       }
      
       public void setRole(String role) {
       this.role = role;
       }
      
       public String getDescription() {
       return description;
       }
      
       public void setDescription(String description) {
       this.description = description;
       }
      
       public List<User> getUsers() {
       if (users == null)
       users = new Vector<User>(0);
       return users;
       }
      
       public void setUsers(List<User> users) {
       this.users = users;
       }
      
       /*
       * (non-Javadoc)
       *
       * @see java.lang.Object#hashCode()
       */
       @Override
       public int hashCode() {
       final int PRIME = 31;
       int result = 1;
       result = PRIME * result + idrole;
       return result;
       }
      
       /*
       * (non-Javadoc)
       *
       * @see java.lang.Object#equals(java.lang.Object)
       */
       @Override
       public boolean equals(Object obj) {
       if (this == obj)
       return true;
       if (obj == null)
       return false;
       if (getClass() != obj.getClass())
       return false;
       final Role other = (Role) obj;
       if (idrole != other.idrole)
       return false;
       return true;
       }
      
       @PrePersist
       public void format() {
       role = Formatter.captializeFirstLetter(role);
       }
      }


      And the exception...
      java.lang.IllegalArgumentException: Collection referenced by UISelectItems with binding '#{rolemanager.destination}' and Component-Path : {Component-Path : [Class: org.ajax4jsf.framework.ajax.AjaxViewRoot,ViewId: /credentials.xhtml][Class: javax.faces.component.html.HtmlForm,Id: credentials][Class: javax.faces.component.html.HtmlSelectManyListbox,Id: _id33][Class: javax.faces.component.UISelectItems,Id: _id34]} does not contain Objects of type SelectItem
      


      Mickael