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 :

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>
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
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>
La page s'affiche correctement avec uniquement le nom et la description (l'id est utilisé pour la base de données.

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 :

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
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...

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 :
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>
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
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");
	}	
}
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
 
			<h:inputHidden value="#{CategoryDetailBean.category.id}"/>
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.

Qu'en pensez-vous ?

Et merci pour les réponses :-)

Lucas