Bonjour,
Lors du lancement de mon appli, un SplashScreen demande au user de s'authentifier. J'utilise DS pour injecter le service permettant l'identification.
J'utilise le splashScreen de PDE et son InteractiveSplashHandler.
Mon bug: j'ai le droit à un jolie NullPointerException lorsque le user s'authentifie. J'ai identifié le problème sauf que je n'arrive pas à le résoudre
Mon Handler
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159 public class InteractiveSplashHandler extends AbstractSplashHandler { private final static int F_LABEL_HORIZONTAL_INDENT = 175; private final static int F_BUTTON_WIDTH_HINT = 80; private final static int F_TEXT_WIDTH_HINT = 175; private final static int F_COLUMN_COUNT = 3; private Composite fCompositeLogin; private Text fTextUsername; private Text fTextPassword; private Button fButtonOK; private Button fButtonCancel; private boolean fAuthenticated; private IUserService userService; private User user ; /** * */ public InteractiveSplashHandler() { System.out.println("Consructor"); fCompositeLogin = null; fTextUsername = null; fTextPassword = null; fButtonOK = null; fButtonCancel = null; fAuthenticated = false; } /* * (non-Javadoc) * * @see org.eclipse.ui.splash.AbstractSplashHandler#init(org.eclipse.swt.widgets.Shell) */ public void init(final Shell splash) { // Store the shell super.init(splash); // Configure the shell layout configureUISplash(); // Create UI createUI(); // Create UI listeners createUIListeners(); // Force the splash screen to layout splash.layout(true); // Keep the splash screen visible and prevent the RCP application from // loading until the close button is clicked. doEventLoop(); } /** * */ private void doEventLoop() { Shell splash = getSplash(); while (fAuthenticated == false) { if (splash.getDisplay().readAndDispatch() == false) { splash.getDisplay().sleep(); } } } /** * */ private void createUIListeners() { // Create the OK button listeners createUIListenersButtonOK(); // Create the cancel button listeners createUIListenersButtonCancel(); } /** * */ private void createUIListenersButtonCancel() { fButtonCancel.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleButtonCancelWidgetSelected(); } }); } /** * */ private void handleButtonCancelWidgetSelected() { // Abort the loading of the RCP application getSplash().getDisplay().close(); System.exit(0); } /** * */ private void createUIListenersButtonOK() { fButtonOK.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleButtonOKWidgetSelected(); } }); } /** * */ private void handleButtonOKWidgetSelected() { String username = fTextUsername.getText(); String password = fTextPassword.getText(); System.out.println("handleButtonOKWidgetSelected userservice= "+userService); this.user = userService.findUser(1); if((username.equals(user.getLogin()) ) && (password.equals(user.getPassword()) )) { fAuthenticated = true; } else { MessageDialog.openError( getSplash(), "Authentication Failed", //$NON-NLS-1$ "A username and password must be specified to login."); //$NON-NLS-1$ } } /////////////// Création de l'interface graphique // Method will be used by DS to set the user Service public synchronized void setService(IUserService userService) { System.out.println("User Service was set in UI."); this.userService = userService; System.out.println("setService userservice= "+userService); } // Method will be used by DS to unset the user Service public synchronized void unsetService(IUserService userService) { System.out.println("User Service was unset in UI."); if (this.userService == userService) { this.userService = null; } } }
Quelque trace dans la console :
Comme vous pouvez le constater avec la trace dans le constructeur, le handler est appelé 2 fois.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Consructor User Service was set in UI. setService userservice= org.pegase.services.impl.UserServiceImpl@5c74cb02 Consructor handleButtonOKWidgetSelected userservice= null user writing= admin user bdd= admin password writing= admin password bdd= admin
Lors de la première instance, le service est bien injecté
Ensuite, le handler est instancié une seconde fois.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2setService userservice= org.pegase.services.impl.UserServiceImpl@5c74cb02
Lorsque le user clique sur OK, la trace dans la méthode handleButtonOKWidgetSelected nous permet de voir que le service est null
le component.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2handleButtonOKWidgetSelected userservice= null
Avez-vous une idée pour éviter d'instancier le Handler deux fois et donc éviter ce NullPointerException ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <?xml version="1.0" encoding="UTF-8"?> <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.pegase.ui"> <implementation class="org.pegase.ui.splashHandlers.InteractiveSplashHandler"/> <reference bind="setService" cardinality="1..1" interface="org.pegase.services.IUserService" name="IUserService" policy="static" unbind="unsetService"/> </scr:component>
D'avance merci
Partager