Bonjour,
Je travaille sur une application utilisant JSF avec Wildfly 8 comme conteneur et PrimeFaces pour l'aspect graphique,
Je bloque sur un point particulier, je souhaite que l'utilisateur puisse sélectionner un 'jeu de scénario' parmi une liste de jeux de scénarios tirée de la base de données puis afficher des éléments de ce jeu de scénario (données de temps ou réseau), leur associer du texte pour afficher comme légende sur un graphique à créer.
Le problème vient du fait que la méthode init() de ma classe (utilisée avec @PostConstruct) est appelée à différents moments du traitement ce qui me réinitialise mes données et je termine alors avec un NullPointerException.
Je ne sais pas si c'est un problème de cycle de vie JSF, d'une mauvaise utilisation de Primefaces et d'ajax ou encore autre chose.
Traitement
Dans une classe MBStatistics associée une page statistics.xhtml, je crée ma liste de jeux de scénarios dans une nouvelle fenêtre avec une classe MBStatView associée la page statView.xhtml (utilisation d'un Listener). L'utilisateur sélectionne une des lignes de la liste ce qui retourne un jeu de scenario 'jeuscen'.
A partir de là une liste d'objets DataToPost 'listScenData' est mise à jour avec les valeurs du Jeu de Scenario (toujours dans la page statistics)
L'utilisateur peut en sélectionner plusieurs parmi les 8 valeurs ce qui renvoie une nouvelle liste d'objets DataToPost 'selectedData'.
Et des que l'utilisateur clique sur le bouton permettant de générer des graphes, la méthode init() est rappelée (entre autre) et tous mes objets réinitialisés.
A noter que mon objet 'jeuscen' est aussi réinitialisé alors qu'il n'est pas présent dans cette méthode ce qui me fait croire que tous les objets sont réinitialisés lors d'un rechargement de la page.
J'utilise dans ma page statistics.xhtml de l'ajax avec une option update sur un commandButton pour mettre à jour ma liste d'objets DataToPost
http://www.primefaces.org/showcase/ui/df/data.xhtml
MBStatistics
statistics.xhtml
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124 @ManagedBean @RequestScoped public class MBStatistics implements Serializable { private static final long serialVersionUID = 1L; private Jeuscenario jeuscen; private DataToPost dtp1 = new DataToPost(1, "No Data", "Result Time", ""); private DataToPost dtp2 = new DataToPost(2, "No Data", "Result Time", ""); ... private DataToPost dtp8 = new DataToPost(8, "No Data", "Network Time", ""); private List <DataToPost> listScenData = new ArrayList<DataToPost> (); @PostConstruct private void initMBStat() { .... listScenData.add(dtp1); listScenData.add(dtp2); listScenData.add(dtp3); listScenData.add(dtp4); listScenData.add(dtp5); listScenData.add(dtp6); listScenData.add(dtp7); listScenData.add(dtp8); System.out.println("MBStatistics : initMBStat finish"); } ////////////////////////////////////////////////////////////// public void chooseJeuscen() { Map<String,Object> options = new HashMap<String, Object>(); options.put("resizable", false); options.put("draggable", false); options.put("modal", true); RequestContext.getCurrentInstance().openDialog("statView", options, null); } ////////////////////////////////////////////////////////////// public void onJeuscenChosen(SelectEvent event) { jeuscen = (Jeuscenario) event.getObject(); System.out.println("jeuscen Choosen : " +jeuscen.getName()); // attribution des données temps et réseau pour affichage f_listData.add(jeuscen.getScenarios().get(0).getResultimes().getNametime1()); dtp1=listScenData.get(0); dtp1.setName(jeuscen.getScenarios().get(0).getResultimes().getNametime1()); listScenData.remove(0); listScenData.add(0,dtp1); f_listData.add(jeuscen.getScenarios().get(0).getResultimes().getNametime2()); if (jeuscen.getScenarios().get(0).getResultimes().getNametime2()==null) {} else { dtp2=listScenData.get(1); dtp2.setName(jeuscen.getScenarios().get(0).getResultimes().getNametime2()); listScenData.remove(1); listScenData.add(1,dtp2); f_listData.add(jeuscen.getScenarios().get(0).getResultimes().getNametime2()); } .... if (jeuscen.getScenarios().get(0).getBdbnetwork().getNamenetw4()==null) {} else { dtp8=listScenData.get(7); dtp8.setName(jeuscen.getScenarios().get(0).getBdbnetwork().getNamenetw4()); listScenData.remove(7); listScenData.add(7,dtp8); f_listData.add(jeuscen.getScenarios().get(0).getBdbnetwork().getNamenetw4()); } f_listData.add("<var parameter>"); varParameter=jeuscen.getVarparameter(); System.out.println("onJeuscenChosen finish"); } ////////////////////////////////////////////////////////////// public String createChart(){ // Build lists of String for time and network for create chart int cptResultimes=0; int cptBdbnetworks=0; /// TEST for (DataToPost dtp : listScenData) { System.out.println("listScenData : data n°"+dtp.getId()+", name :"+dtp.getName()+", legend"+dtp.getLegend()); } for (DataToPost dtp : selectedData) { System.out.println("selectedData : data n°"+dtp.getId()+", name :"+dtp.getName()+", legend"+dtp.getLegend()); } System.out.println("nb de DataToPost "+selectedData.size()); System.out.println(dtp1.getName() +" "+ dtp2.getName()+" "+ dtp3.getName()+" "+ dtp4.getName()); ... for (int i=0; i<jeuscen.getNbscen();i++) { listScenFinal.add(jeuscen.getScenarios().get(i)); } ... }
On voit sur le résultat en console que dès que le bouton de génération de graphes est cliqué (default task-35) la méthode init() est de nouveau appelé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
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 <h:form id="formToUpdate" target="_blank"> <div class="ui-grid ui-grid-responsive"> <div class="ui-grid-row"> <div class="ui-grid-col-12"> <p:commandButton value="Select Set Scenario" icon="ui-icon-extlink" actionListener="#{mBStatistics.chooseJeuscen()}"> <p:ajax event="dialogReturn" listener="#{mBStatistics.onJeuscenChosen}" update="ckb_DataPost" /> </p:commandButton> </div> </div> </div> <br /> <br /> <div class="ui-grid ui-grid-responsive"> <div class="ui-grid-row"> <div class="ui-grid-col-6"> <h3>Build Chart</h3> <div > <p:dataTable id="ckb_DataPost" var="dataToPost" value="#{mBStatistics.listScenData}" selection="#{mBStatistics.selectedData}" rowKey="#{dataToPost.id}" style="margin-bottom:0"> <f:facet name="header"> Checkbox </f:facet> <p:column selectionMode="multiple" style="width:16px;text-align:center"/> <p:column headerText="Id"> <h:outputText value="#{dataToPost.id}" /> </p:column> <p:column headerText="Name"> <h:outputText value="#{dataToPost.name}" /> </p:column> <p:column headerText="Type"> <h:outputText value="#{dataToPost.timeOrNet}" /> </p:column> <p:column headerText="Legend"> <h:inputText value="#{dataToPost.legend}" /> </p:column> </p:dataTable> </div>
Résultat en console
Si vous avez une solution ou une idée pour contourner le problème, cela m'aiderait beaucoup.
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 10:20:36,389 INFO [stdout] (default task-11) MBStatistics : initMBStat finish 10:20:39,976 INFO [stdout] (default task-22) MBStatistics : initMBStat finish 10:20:40,149 INFO [stdout] (default task-24) --Select all jeuscenarios order by id 10:20:40,362 INFO [stdout] (default task-24) --Select all scenarios order by id 10:20:40,783 INFO [stdout] (default task-24) MBStatView : init finish 10:20:42,751 INFO [stdout] (default task-33) MBStatistics : initMBStat finish 10:20:42,752 INFO [stdout] (default task-33) jeuscen Choosen : SDU16-F9900 10:20:42,756 INFO [stdout] (default task-33) Resultimes :Java Time | Elap. Time | SqlnetMsgFromDblink | SqlnetMoreDataDblink 10:20:42,757 INFO [stdout] (default task-33) Network :Nb Fetch | MsgFromDblinkPckts | MoreDataDblinkPckts | null 10:20:42,757 INFO [stdout] (default task-33) listScenData :data n°1, name :Java Time, legend 10:20:42,758 INFO [stdout] (default task-33) listScenData :data n°2, name :Elap. Time, legend 10:20:42,758 INFO [stdout] (default task-33) listScenData :data n°3, name :SqlnetMsgFromDblink, legend 10:20:42,758 INFO [stdout] (default task-33) listScenData :data n°4, name :SqlnetMoreDataDblink, legend 10:20:42,758 INFO [stdout] (default task-33) listScenData :data n°5, name :Nb Fetch, legend 10:20:42,758 INFO [stdout] (default task-33) listScenData :data n°6, name :MsgFromDblinkPckts, legend 10:20:42,758 INFO [stdout] (default task-33) listScenData :data n°7, name :MoreDataDblinkPckts, legend 10:20:42,759 INFO [stdout] (default task-33) listScenData :data n°8, name :No Data, legend 10:20:42,759 INFO [stdout] (default task-33) nb de DataToPost 8 10:20:42,759 INFO [stdout] (default task-33) Java Time Elap. Time SqlnetMsgFromDblink SqlnetMoreDataDblink 10:20:42,759 INFO [stdout] (default task-33) onJeuscenChosen finish 10:21:02,602 INFO [stdout] (default task-35) MBStatistics : initMBStat finish 10:21:02,620 INFO [stdout] (default task-35) listScenData : data n°1, name :No Data, legende 10:21:02,621 INFO [stdout] (default task-35) listScenData : data n°2, name :No Data, legend 10:21:02,621 INFO [stdout] (default task-35) listScenData : data n°3, name :No Data, legend 10:21:02,621 INFO [stdout] (default task-35) listScenData : data n°4, name :No Data, legend 10:21:02,621 INFO [stdout] (default task-35) listScenData : data n°5, name :No Data, legendf 10:21:02,621 INFO [stdout] (default task-35) listScenData : data n°6, name :No Data, legend 10:21:02,622 INFO [stdout] (default task-35) listScenData : data n°7, name :No Data, legend 10:21:02,622 INFO [stdout] (default task-35) listScenData : data n°8, name :No Data, legend 10:21:02,622 INFO [stdout] (default task-35) selectedData : data n°1, name :No Data, legende 10:21:02,622 INFO [stdout] (default task-35) selectedData : data n°5, name :No Data, legendf 10:21:02,622 INFO [stdout] (default task-35) nb de DataToPost 2 10:21:02,623 WARNING [javax.enterprise.resource.webcontainer.jsf.lifecycle] (default task-35) #{mBStatistics.createChart()}: java.lang.NullPointerException
J'ai du mal à identifier la cause de cette régénération.
Merci !
Partager