web-dev-qa-db-fra.com

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

J'essayais d'implémenter un DataTable Editable avec RowSelection activé.

Mais il jette une exception:

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

J'ai implémenté le DataModel dans la classe d'objet et la classe de bean géré, mais l'erreur est la même. Maintenant, seul un tableau vide apparaît pour moi. S'il vous plaît aider.

22
user1281029

Il y a deux solutions à ce problème:

  1. Ajout d'attributs rowKey, selection et selectionMode à dataTable
  2. Implémentation de l'interface SelectableDataModel et extension d'un DataModel comme ListDataModel pour remplir le dataTable

Le premier est plus simple. Ajouter rowKey="#{myEntity.carID}" à votre p:dataTable devrait résoudre votre problème 

38
rags

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 du nouvel élément. Ou en d'autres termes, pour l'exemple, si myEntity.carID est null.

20
Nublodeveloper

En plus des solutions données par les chiffons, je voudrais mentionner que si la clé de ligne est "NULL" ou si votre liste entière est "NULL", vous risquez d'obtenir la même erreur, même si vous avez effectué toutes les étapes susmentionnées. Si vous souhaitez afficher 0 ligne, retournez une liste avec 0 éléments. Ne retournez pas null pour la liste.

3
RajdeepS

Le message d'erreur indique que votre modèle de données n'implémente pas les interfaces SelectableDataModel. Ce doit être une classe séparée. Voici un exemple tiré de la vitrine de PF qui explique comment définir la table de données:

import org.primefaces.model.SelectableDataModel;  

public class CarDataModel extends ListDataModel<Car> implements SelectableDataModel<Car> {    
   ...
}
2
Matt Handy

N'oubliez pas de placer la valeur rowKey dans la syntaxe EL.

rowKey="row.id" 

échouera mais 

rowKey="#{row.id}" 

y arrivera.

0
J Slick