Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

primefaces p collector


Sujet :

JSF Java

  1. #1
    Nouveau membre du Club
    primefaces p collector
    Salut. J'utlise un p collector dans un p dialogue pour récupérer des données dans un p datatable. mais il se trouve qu'a partir de la deuxième insertion il n'ajoute pas une nouvelle ligne dans le p datatable mais remplace la première insertion. J'utilise primefaces 5.0.
    voici une partie de la vue
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <h:form id="commanderform">
                       <p:growl id="msgs" />
                       <h:panelGroup id="display" >
                       <p:fieldset legend="INFORMATIONS SUR LES PRODUITS COMMANDES"  >
                        <h:panelGrid columns="8">
                         outputLabel value="#{bundle.CreateCommanderLabel_prixUniteCom}" for="prixUniteCom" />
                            <p:inputText id="prixUniteCom" value="#{viewCommander.commander.prixUniteCom}" title="#{bundle.CreateCommanderTitle_prixUniteCom}" required="true" requiredMessage="#{bundle.CreateCommanderRequiredMessage_prixUniteCom}"/>
                            <p:outputLabel value="#{bundle.CreateCommanderLabel_qteCom}" for="qteCom" />
                            <p:inputText id="qteCom" value="#{viewCommander.commander.qteCom}" title="#{bundle.CreateCommanderTitle_qteCom}" required="true" requiredMessage="#{bundle.CreateCommanderRequiredMessage_qteCom}"/>
     
                            <p:outputLabel value="#{bundle.CreateCommanderLabel_produit}" for="produit" />
                            <p:selectOneMenu id="produit" value="#{viewCommander.commander.produit}" required="true" requiredMessage="#{bundle.EditCommanderRequiredMessage_produit}">
                                <f:selectItems value="#{produitController.produit}"
                                               var="produitItem"
                                               itemValue="#{produitItem}"/>
                            </p:selectOneMenu>
                             <p:commandButton id="btn_reset" value="Reset" type="reset"/>
                             <p:commandButton id="createButton" icon="ui-icon-plus" ajax="true" update="dataliste msgs @parent"  value="ajouter"   >
                                <p:collector   value="#{viewCommander.commander}"  addTo="#{viewCommander.commanders}" unique="false"  />   </p:commandButton>
                        </h:panelGrid>
     
                        </p:fieldset>
     
                    </h:panelGroup>

    le managedbean
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    /*
    @ManagedBean
    @RequestScoped
    public class viewCommander {
     
        public viewCommander() {
        }
        private List<Commander> commanders = new ArrayList<>();
    	private Commander commander = new Commander();
    	public List<Commander> getCommanders() {
    		return commanders;
    	}
    	public void setCommanders(List<Commander> commanders) {
    		this.commanders = commanders;
    	}
    	public Commander getCommander() {
    		return commander;
    	}
    	public void setCommander(Commander commander) {
    		this.commander = commander;
    	}
    }

    le hash code et le equals qui se trouvent dans la classe
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     public int hashCode() {
           int hash = 0;
            hash += (commanderPK != null ? commanderPK.hashCode() : 0);
            return hash;
        }
     
        @Override
        public boolean equals(Object object) {
            // TODO: Warning - this method won't work in the case the id fields are not set
            if (!(object instanceof Commander)) {
                return false;
            }
            Commander other = (Commander) object;
            if ((this.commanderPK == null && other.commanderPK != null) || (this.commanderPK != null && !this.commanderPK.equals(other.commanderPK))) {
                return false;
            }
            return true;
        }

  2. #2
    Modérateur

    Le scope @RequestScoped n'est vraiment pas approprié là, tu devrais utiliser @ViewScoped.
    Avec @RequestScoped, ton ManagedBean (et ce qu'il contient) est recréé à chaque requête, ta liste repart donc toujours vide. Normalement, si tu fais F5 sur ta page, tu devrais avoir une liste vide
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau membre du Club
    primefaces p collector
    ok j'ai ajouté une fonction reinit qui s'exécute (actionlistener) au clic du bouton create et modifier le bean pour utiliser viewscoped. Donc le datatable accepte désormais de nouvelles lignes mais toutefois donne la possibilité d'entrer des lignes identiques ce qui ne devrait pas être le cas. En effet la même désignation de produit ne doit pas figurer sur plusieurs lignes du datatable à la fois. Je cherche une idée pour comparer la valeur entrée nouvellement aux anciennes présentes dans le datatable avant de l'insérer ou non.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     public String reinit() {  
        commander=new Commander();
         return null;
        }

  4. #4
    Modérateur

    As-tu essayé l'attribut 'unique' du tag <p:collector> ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Nouveau membre du Club
    oui j'ai essayé l'attribut unique. Quand je le mets à true le datatable n'accepte que l'ajout d'une seule ligne même quand j'entre d'autres valeurs différentes de celle qui est présente. J'ai l'impression que la solution serait de modifier soit mon hash code ou mon equals. je l'ai modifié pourtant pas le résultat voulu. Aussi Comme les définitions de ces deux méthodes sont utiles pour d'autres besoins je cherche une autre solution sinon j'accepterais quand même d'abord toute solution qui marche.

  6. #6
    Modérateur

    Ta méthode hashCode() fait référence à un objet CommanderPK, si celui-ci est null après ton ajout (et j'imagine que c'est le cas vu ce que tu décris), c'est normal que tu ne puisses ajouter qu'une ligne puisque tu renvois 0 si cet objet est null.
    La solusion consisterait à faire un super.hashCode() dans ce cas, comme ceci
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public int hashCode() 
    {
        int hash = 0;
        hash += (commanderPK != null ? commanderPK.hashCode() : super.hashCode());
        return hash;
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Nouveau membre du Club
    J'ai modfié les méthodes comme ceci pour le collector fonctionne. Ta proposition n'avait pas fonctionné. Merci à tous!!!

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       @Override
     public int hashCode() {
           int hash = 1;
           if(produit!= null)
               hash = hash * 31 + produit.hashCode();
     
     
           return hash;   }


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       public boolean equals(Object obj) {
            if(!(obj instanceof Commander))
                return false;
     
            Commander commander = (Commander) obj;
     
            return (commander.getProduit()!= null && commander.getProduit().equals(produit) );
        }

###raw>template_hook.ano_emploi###