Bonjour à tous,
Alors voila, je vais m'efforcer d'expliquer clairement mon problème.
J'ai 2 pages JSF. Une qui affiche une liste de catégories et 1 qui permet d'en modifier 1.
Une catégorie est définie par un id, un name et une description.
Ma page de liste fonctionne très bien et redirige vers ma page de modification correctement par le biais de ce bout de code :
Comme vous pouvez le voir, j'ai un bean CategoryDetailBean que j'ai défini dans le fichier faces-config comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <p:commandButton ajax="false" action="#{NavigationBean.goDetailCategory}" icon="ui-icon-search" title="Voir la fiche"> <f:setPropertyActionListener value="#{category}" target="#{CategoryDetailBean.category}" /> </p:commandButton>
La page s'affiche correctement avec uniquement le nom et la description (l'id est utilisé pour la base de données.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <managed-bean> <managed-bean-name>CategoryDetailBean</managed-bean-name> <managed-bean-class>com.harsze.timetracer.bean.CategoryDetailBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>
Le problème viens de la modification. J'ai une exception comme quoi l'id est null. En effet il l'est malgré qu'il soit bien défini. Cf les logs de mon projet :
Le premier setter interviens lors de la navigation (grâce au f:setPropertyActionListener. Les 3 getters sont appelés au chargement de ma page ==> Ils ont l'air corrects la valeur de l'id est bien récupérée...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 CategoryDetailBean - Appel du setter : 5 CategoryDetailBean - Appel du getter : 5 CategoryDetailBean - Appel du getter : 5 CategoryDetailBean - Appel du getter : 5 CategoryDetailBean - Appel du getter : null CategoryDetailBean - Appel du getter : null CategoryDetailBean - Appel du getter : null CategoryDetailBean - Appel du getter : null CategoryDetailBean - Appel du getter : null CategoryDetailBean - Appel du getter : null CategoryDetailBean - bla bla CategoryDetailBean - CategoryDetailBean - COMMERCIALE
Par contre, dès que je clique pour valider, la boum, mon id repasse à null. Les autres valeurs sont ok.
Voici ma page de détail :
et voici mon bean :
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
26 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui"> <ui:composition> <h:form> <h3><h:outputText value="Modification d'une catégorie"/></h3> <p:messages/> <h:panelGrid columns="2" cellpadding="5px"> <h:outputLabel value="Nom de la catégorie :" for="name"></h:outputLabel> <p:inputText id="name" value="#{CategoryDetailBean.category.name}" required="true" requiredMessage="Vous devez entrer un nom pour la catégorie"/> <h:outputLabel value="Description :" for="description"></h:outputLabel> <p:editor id="description" value="#{CategoryDetailBean.category.description}" width="600"/> </h:panelGrid> <br/> <p:commandButton value="Valider" action="#{CategoryDetailBean.update}" ajax="false"/> </h:form> </ui:composition> </html>
Donc pour solutionner le problème, je suis obligé de mettre mon id dans le page par exemple par ce bout de code :
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 package com.harsze.timetracer.bean; import java.io.Serializable; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; import com.harsze.timetracer.entity.Category; import com.harsze.timetracer.model.functional.CategoriesModel; import com.harsze.timetracer.util.HarszeToolkit; public class CategoryDetailBean extends BaseBean implements Serializable{ /** * */ private static final long serialVersionUID = -8684894588850123951L; private Category category; public CategoryDetailBean() { logger = Logger.getLogger(CategoryDetailBean.class); } public void setCategory(Category category){ logger.debug("Appel du setter : "+category.getId()); this.category = category; } public Category getCategory(){ if (this.category == null) this.category = new Category(); logger.debug("Appel du getter : "+this.category.getId()); return this.category; } public String update() throws Exception{ logger.debug(this.category.getDescription()); logger.debug(this.category.getId()); logger.debug(this.category.getName()); CategoriesModel.UpdateCategory(this.category); HarszeToolkit.FacesMessage("Catégorie modifiée avec succès."); NavigationBean nb = (NavigationBean) HarszeToolkit.getBean("NavigationBean"); return nb.setRedirect("com_categories","list_categories"); } }
Mais je trouve ca illogique. La valeur de l'id est récupérer depuis le précédent bean et non modifiable alors je n'ai pas besoin de la mettre sur ma page.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2<h:inputHidden value="#{CategoryDetailBean.category.id}"/>
Qu'en pensez-vous ?
Et merci pour les réponses :-)
Lucas
Partager