dataTable sortBy fonction ne fonctionne pas(primefaces)
J'ai un problème avec le primefaces dataTable composant. Je ne sais pas pourquoi il ne court les données dans la table lorsque je clique sur elle.
<p:dataTable var="garbage" value="#{resultsController.allGarbage}" dynamic="true" paginator="true" paginatorPosition="bottom" rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="5,10,15">
<p:column sortBy="#{garbage[0].filename}">
<f:facet name="header">
<h:outputText value="Filename" />
</f:facet>
<h:outputText value="#{garbage[0]}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Description" />
</f:facet>
<h:outputText value="#{garbage[1]}" />
</p:column>
<p:column sortBy="#{garbage[2].uploadDate}">
<f:facet name="header">
<h:outputText value="Upload date" />
</f:facet>
<h:outputText value="#{garbage[2]}" />
</p:column>
</p:dataTable>
C'est le managed bean
@ManagedBean
@RequestScoped
public class ResultsController {
@EJB
private ISearchEJB searchEJB;
private Garbage[] garbage;
public List<Garbage[]> getAllGarbage() {
return searchEJB.findAllGarbage();
}
public Garbage[] getGarbage() {
System.out.println("VALUES!!!!!!!!" + garbage[0].getFilename());
return garbage;
}
public void setGarbage(Garbage[] garbage) {
this.garbage = garbage;
}
}
C'est l'EJB qui permet l'accès aux données
@Stateless(name = "ejbs/SearchEJB")
public class SearchEJB implémente ISearchEJB {
@PersistenceContext
private EntityManager em;
public List<Garbage[]> findAllGarbage() {
Query query = em.createNamedQuery("findAllGarbage");
return query.getResultList();
}
}
Et c'est l'entité(représentation des Données)
@NamedQuery(name = "findAllGarbage", query = "SELECT g.filename, g.description, g.uploadDate FROM Garbage g;")
@Entity
public class Garbage {
@Id
@GeneratedValue
@Column(nullable = false)
private Long id;
@Column(nullable = false)
private String filename;
@Column(nullable = false)
private String fileType;
@Column(nullable = false)
private String uploadDate;
@Column(nullable = false)
private String destroyDate;
@Lob
@Column(nullable = false)
private byte[] file;
@Column(nullable = false)
private String description;
...//Getters and Setters
Comme indiqué dans l'image il n'y a pas de changements, alors que les boutons de tri sont cliqué:
C'est ce que la console dit:
GRAVE: Erreur dans le tri
mise à JOUR
public List<Garbage> findAllGarbage() {
Query query = em.createNamedQuery("findAllGarbage");
List<Garbage> gList = new ArrayList();
for (Object o: query.getResultList()) {
Garbage tmpG = new Garbage();
tmpG.setFilename(((Garbage) o).getFilename());
tmpG.setUploadDate(((Garbage) o).getUploadDate());
tmpG.setDescription(((Garbage) o).getDescription());
gList.add(tmpG);
}
return gList;
}
La modification de managed bean
@ManagedBean
@RequestScoped
public class ResultsController {
@EJB
private ISearchEJB searchEJB;
private Garbage garbage;
public List<Garbage> getAllGarbage() {
return searchEJB.findAllGarbage();
}
public Garbage getGarbage() {
return garbage;
}
public void setGarbage(Garbage garbage) {
this.garbage = garbage;
}
}
De la modification de la JSF
<p:dataTable var="garbage" value="#{resultsController.allGarbage}" dynamic="true" paginator="true" paginatorPosition="bottom" rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="5,10,15">
<p:column sortBy="#{garbage.filename}" parser="string">
<f:facet name="header">
<h:outputText value="Filename" />
</f:facet>
<h:outputText value="#{garbage.filename}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Description" />
</f:facet>
<h:outputText value="#{garbage.description}" />
</p:column>
<p:column sortBy="#{garbage.uploadDate}" parser="string">
<f:facet name="header">
<h:outputText value="Upload date" />
</f:facet>
<h:outputText value="#{garbage.uploadDate}" />
</p:column>
</p:dataTable>
- Je ne comprends pas ce que vous essayez de faire. Vous avez une liste de tableaux et de votre table aurait l'impression d'une représentation de Chaîne de Poubelle instance dans chaque cellule. Un peu plus d'infos sur la structure de données permettrait (peut-être).
- Je viens de mettre à jour et ajout de la façon dont les EJB ressemble, et aussi l'Entité Ordures. J'espère que peut vous aider à comprendre. Dois-je besoin d'ajouter de balise de script sur ma balise head peut-être? Je ne comprends pas pourquoi il ne fonctionne pas.
- J'ai trouvé quelque chose d'intéressant à ce guide en page 94 web-cinema.googlecode.com/files/primefaces_users_guide_140210.pdf C'est le primefaces guide. Il est dit que si ma datatable est dynamique, devrais-je ajouter parser=”string” attribut de la colonne. Je l'ai fait mais cela n'a pas corrigé la GRAVE: Erreur dans le Tri chose. Je n'ai aucune idée de ce qu'est erreur de tri.
- Vous pourriez transformer l'Objet[] dans une Liste de Déchets d'objets (à partir du byte[] et les autres champs vides).
Vous devez vous connecter pour publier un commentaire.
De la Tutoriel Java EE j'ai lu les suivantes:
Maintenant votre requête ressemble:
De votre classe d'entité
Garbage
j'ai lu quefilename
,description
,uploadDate
sont des Chaînes de caractères. Alors votre requête retourne une liste deObject[]
et chaque élément du tableau contient une Chaîne de caractères et non unGarbage
objet.Si votre tableau contient des Chaînes et non les Ordures, vous ne pouvez pas appeler
garbage[0].filename
dans votre facelet.Essayez de changer votre Requête de la manière suivante:
Ensuite, vous obtenez un
List<Garbage>
. Dans leSearchEJB
changer la signature de la méthode à la suivante:Changement de méthodes dans votre
ResultsController
managed bean en conséquence (maintenant, vous avez toujours besoin d'unList<Garbage>
et pas unList<Garbage[]>
).Enfin modifier votre
p:dataTable
(présentée pour la première colonne):Mise à JOUR:
Si vous voulez garder votre requête, vous pouvez convertir le
Object[]
dans une liste deGarbage
objets et de laisser les champs manquants vide. Quelque chose comme ceci (ajouter un constructeur à votre Poubelle de la classe):Mise à JOUR 2:
Dans votre mise à jour que vous avez manqué encore une fois, que votre tableau contient les chaînes de caractères. Et les chaînes de commander votre expression de sélection est ordonné: l'élément 0: nom de fichier, élément 1: description de l'élément 2: uploadDate.
Changer votre boucle de la manière suivante:
<p:column sortBy="#{garbage[0]}">
ne fonctionne pas?Je suis conscient que cela a été demandé il y a 3 ans mais je vais vous donner ma solution juste au cas où quelqu'un tombe sur ce.
Fondamentalement, ce qui doit être fait est d'appeler le findAll() la méthode de vos données à l'intérieur d'un constructeur. Mais depuis EJB façade est injecté après la construction, vous ne pouvez pas appeler le findAllGarbage() la méthode à l'intérieur d'un constructeur. Vous pouvez le faire dans une méthode annotée avec
@PostConstruct:
Aussi: l'appel de la findAllGarbage() la méthode dans un getter réinitialise les données et la fonction de tri n'aura aucun effet. Alors peut-être supprimer la méthode de la lecture et de déplacer le findAll logique d'ailleurs, par exemple sur un bouton d'action dans le cas d'ajout de données à la table.
Plus sur les EJB injection ici: ejbFacade est null