web-dev-qa-db-fra.com

DataModel doit implémenter org.primefaces.model.SelectableDataModel lorsque la sélection est activée.

J'essaie de créer un DataTable avec une sélection de plusieurs lignes, mais je reçois une erreur. Voici le lien du tutoriel http://www.primefaces.org/showcase/ui/datatableRowSelectionMultiple.jsf :

Voici mon xhtml:

    <p:dataTable border="1" value="#{projectAdminisrationMB.projectNoUsersList}" 
                     var="userObj"
                     selection="#  
         {projectAdminisrationMB.selectedUsers}"
 selectionMode="multiple" rowIndexVar="rowIndex"binding="#{table2}">
<p:column id="column3">
<f:facet name="header">
<h:outputText value=" user "></h:outputText>
</f:facet>

      <h:outputText value="#{userObj.name}"/>  

                            /
  <h:outputText value="#{userObj.lastName}"></h:outputText>

  &nbsp;
   <h:outputText value="#{userObj.firstName}"></h:outputText>
  </p:column>

    <f:facet name="footer">  
     <p:commandButton id="addProjectUser" value=" Add " onclick="dlg1.show()" />  
      <p:commandButton id="deleteProjectUser" value=" Delete " />  

    </f:facet> 

</p:dataTable>

Haricot géré:

 @ManagedBean
 @SessionScoped
 public class ProjectAdminisrationMB implements Serializable {

private static final long serialVersionUID = 1L;

private String projectName;
private List <User> projectUsersList;
private List<User> projectNoUsersList;
private List<User> selectedUsers;

private String projectAdmin;


public ProjectAdminisrationMB() {
    super();
    AdministrationProjectFinal administrationProjectFinal =new    
             AdministrationProjectFinal();
    this.projectUsersList=administrationProjectFinal.getUserList();
    this.projectNoUsersList=administrationProjectFinal.getNotUserList();
}



public String getProjectName() {
    return projectName;
}

public void setProjectName(String projectName) {
    this.projectName = projectName;
}



public List<User> getProjectUsersList() {
    return projectUsersList;
}



public void setProjectUsersList(List<User> projectUsersList) {
    this.projectUsersList = projectUsersList;
}



public String getProjectAdmin() {
    return projectAdmin;
}

public void setProjectAdmin(String projectAdmin) {
    this.projectAdmin = projectAdmin;
}

public List<User> getProjectNoUsersList() {
    return projectNoUsersList;
}



public void setProjectNoUsersList(List<User> projectNoUsersList) {
    this.projectNoUsersList = projectNoUsersList;
}



public List<User> getSelectedUsers() {
    return selectedUsers;
}



public void setSelectedUsers(List<User> selectedUsers) {
    this.selectedUsers = selectedUsers;
}




 }

je reçois cette erreur:

  javax.faces.FacesException: DataModel must implement     
  org.primefaces.model.SelectableDataModel when selection is enabled.....
30
Amira

ajoutez simplement cet attribut rowKey à la balise datatable:

<p:dataTable border="1" value="#{projectAdminisrationMB.projectNoUsersList}" 
 var="userObj"
 rowKey="#{userObj.name}"selection="#{projectAdminisrationMB.selectedUsers}"
 selectionMode="multiple" rowIndexVar="rowIndex"
 binding="#{table2}">
74
Amira Manai

Vous pouvez obtenir cette erreur si vous essayez d'ajouter un nouvel élément à la liste sous-jacente et oubliez d'attribuer une valeur à rowKey de ce nouvel élément.

17
Nublodeveloper

Alternativement à rowKey, vous pouvez envelopper vos données dans un modèle personnalisé qui implémente réellement org.primefaces.model.SelectableDataModel. Ceci est utile si

  • toutes vos classes ont le même type de @Id (par exemple une long) et peuvent implémenter la même interface (par exemple EjbWithId)
  • vous souhaitez ajouter à vos données des fonctionnalités supplémentaires qui ne sont pas spécifiques à un domaine et n'appartiennent pas, par exemple. User.

L'interface peut ressembler à ceci:

public interface EjbWithId
{
  public long getId();
  public void setId(long id);
}

Ensuite, une implémentation générique de SelectableDataModel pour toutes vos classes peut être utilisée:

public class PrimefacesEjbIdDataModel <T extends EjbWithId>
       extends ListDataModel<T> implements SelectableDataModel<T>
{    
  public PrimefacesEjbIdDataModel(List<T> data)
  {  
    super(data);
  }  

  @Override public T getRowData(String rowKey)
  {  
    List<T> list = (List<T>) getWrappedData();  

    for(T ejb : list)
    {  
      if(ejb.getId()==(new Integer(rowKey))){return ejb;}  
    }
    return null;  
  }  

  @Override public Object getRowKey(T item) {return item.getId();}
}

Dans votre @ManagedBean:

private PrimefacesEjbIdDataModel<User> dmUser; //+getter
dmUser = new PrimefacesEjbIdDataModel<User>(administrationProjectFinal.getUserList());
4
Thor

commencez par vérifier si vous avez ajouté rowKey = "# {userObj.id}"  

alors vous devez avoir la liste de tables de données définie dansfilterValueattribut de votre table de données en xhtml, au lieu devaleur.

0
Sayan Kundu