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
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));
		 }
 
		 ...
        }
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
 
<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>
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.

Résultat en console
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
Si vous avez une solution ou une idée pour contourner le problème, cela m'aiderait beaucoup.
J'ai du mal à identifier la cause de cette régénération.

Merci !