Bonjour à tous,
je développe un outil de gestion de pas mal de chose dont des absences d'opérateurs dans ce cas présent.
J'utilise dans un formulaire comme vous le verrai en dessous des listes de sélection. Au départ je récupérais le String et je le traiter avant tout ajout/changement de l'objet pour récupérer les bonnes infos. Or j'ai vu qu'il existait des converter (pour me simplifier la vie). J'ai donc essayé d'intégrer à mon projet le converter que fxrobin avait poster sur ce forum http://www.developpez.net/forums/d11...ique-securise/ , sauf que finalement ca ne se passe pas si bien que ca ...
Lorsque je charge ma page, je vois grâce à des outprint que la map se charge bien avec mes objets. Le problème est que lorsque je récupère les objets en validant le formulaire, je récupère un objet null.
Pouvez - vous m'aider à y voir plus clair ?
Pour info, j'utilise les tech JPA (Eclipselink), JSF (avec notamment primefaces), avec un serveur Glassfish 4 et un SGBD Oracle.
Merci d'avance (et n'hésitez pas à me poser des questions si je ne suis pas assez clair)
Le bean absence
Le converter
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 @Entity public class Absence { @Id @GeneratedValue( generator = "AbsSeq" ) @SequenceGenerator( name = "AbsSeq", sequenceName = "ABSENCE_SEQ", allocationSize = 1 ) private Integer id; @NotNull( message = "Veuillez saisir une cause" ) private String cause; public Integer getId() { return id; } public void setId( Integer id ) { this.id = id; } public String getCause() { return cause; } public void setCause( String cause ) { this.cause = cause; } @Override public boolean equals( Object obj ) { if ( obj == null ) return false; if ( !( obj instanceof Absence ) ) return false; return ( (Absence) obj ).getId() == this.id; } @Override public int hashCode() { int hash = 7; hash = 83 * hash + Objects.hashCode( this.id ); return hash; } }
Le formulaire de ma facelet
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 @SuppressWarnings( "serial" ) @ManagedBean @ViewScoped @FacesConverter( "genericSecuredConverter" ) public class GenericSecuredConverter implements Converter, Serializable { private Map<UUID, Object> temporaryStore = new HashMap<UUID, Object>(); @Override public Object getAsObject( FacesContext context, UIComponent component, String value ) { System.out.println( "" + temporaryStore.get( UUID.fromString( value ) ) ); return temporaryStore.get( UUID.fromString( value ) ); } @Override public String getAsString( FacesContext context, UIComponent component, Object value ) { UUID id = UUID.randomUUID(); temporaryStore.put( id, value ); System.out.println( "id : " + id + " value : " + value ); return id.toString(); } }
Je ne pense pas que l'on aie besoin de mon bean de gestion (il faut quand même savoir qu'il est en ViewScope et que c'est un 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
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 <h:form id="formulaire"> <p:growl id="messages" showDetail="true"/> <p:panel header="Création d'une nouvelle absence" toggleable="true" toggleSpeed="500"> <h:outputLabel for="operateur">Operateur <span class="requis">*</span></h:outputLabel> <p:selectOneMenu value="#{gestionAbsenceOperateurBean.absenceOperateur.operateur}" converter="genericSecuredConverter"> <f:selectItem disabled="true" itemLabel="Choisir un opérateur" /> <f:selectItems value="#{gestionAbsenceOperateurBean.operateurs}" var="ops" itemLabel="#{ops.nom} #{ops.prenom}" itemValue="#{ops}" /> </p:selectOneMenu> <br /> <h:outputLabel for="Absence">Cause d'absence <span class="requis">*</span></h:outputLabel> <p:selectOneMenu value="#{gestionAbsenceOperateurBean.absenceOperateur.absence}" converter="genericSecuredConverter"> <f:selectItem disabled="true" itemLabel="Choisir une cause" /> <f:selectItems value="#{gestionAbsenceOperateurBean.absences}" var="abs" itemLabel="#{abs.cause}" itemValue="#{abs}" /> </p:selectOneMenu> <br /> <h:outputLabel >Date de début : <span class="requis">*</span></h:outputLabel> <p:calendar id="fromD" value="#{gestionAbsenceOperateurBean.absenceOperateur.dateD}" pattern="dd/MM/yyyy" effect="fadeIn" mindate="#{gestionAbsenceOperateurBean.today}" navigator="true" > <p:ajax event="dateSelect" update="toD"/> </p:calendar> <br /> <h:outputLabel >Date de fin : <span class="requis">*</span></h:outputLabel> <p:calendar id="toD" value="#{gestionAbsenceOperateurBean.absenceOperateur.dateF}" pattern="dd/MM/yyyy" effect="fadeIn" mindate="#{gestionAbsenceOperateurBean.absenceOperateur.dateD}" navigator="true" /> <br /> <h:messages globalOnly="true" infoClass="info" /> <p:commandButton value="Créer" action="#{gestionAbsenceOperateurBean.creation}" update=":formulaire2:listeAbOps :formulaire:messages" process="@form" ajax="true"> </p:commandButton> <br /> </p:panel> </h:form>
EDIT: j'ai regardé la taille de la temporaryStore et elle est à zero lorsque je veux récupérer les objets. De plus, lors de l'appel à la méthode getAsString, je remarque qu'en passant à la seconde selectlist, elle se vide....
Partager