OK Ich habe diese tutorial über Web Sockets verfolgt, und ich verstehe 99% der Funktionsweise des Beispielcodes. Wie für die 1%, behandelt es die Dependency Injection. Nach der Untersuchung von DI verstehe ich, dass Klassen abhängig werden von einem Objekt aus einer Klasse (Ether selbst oder einige andere), um zu funktionieren. Hier ist, wie es verwendet wird.Dependency Injection verursacht Null Pointer Exception
package org.example.websocket;
...
import javax.websocket.server.ServerEndpoint;
import javax.inject.Inject;
@ApplicationScoped
@ServerEndpoint("/actions")
public class DeviceWebSocketServer {
@Inject
private DeviceSessionHandler sessionHandler;
@OnOpen
public void open(Session session) {
}
...
}
Ich verstehe, dass die Theorie hier ist die Klasse „DeviceWebSocketServer“ ist abhängig von „DeviceSessionHandler“, um zu funktionieren. Wenn ich diesen Code ausführe, erhalte ich jedoch java.lang.NullPointerException
im Logcat.
So fand ich heraus, dass der Grund warum ist, weil sessionHandler nie initialisiert wird und nur herumhängen ist Null und werfen Ausnahmen herum, als wären sie frei. Ist das nicht der Zweck des @Inject, um dies zu verhindern? Ich bin in der Lage, die NPE zu verhindern, indem ....
private DeviceSessionHandler sessionHandler = new DeviceSessionHandler();
Aber dann die Anwendung verhält sich nicht wie die tutorial sagt, es sollte unter
Testing the Java WebSocket Home Application
Step 4:
ist eine Vorrichtung zum Java WebSocket Heim-Server hinzugefügt und es wird in beiden Webbrowsern gerendert.
Beide Browser werden nicht aktualisiert. Jetzt weiß ich nicht, ob das wegen der DI funktioniert, oder irgendeinen anderen Faktor. Ich brauche Hilfe herauszufinden, warum die Dependency Injection nicht funktioniert, und dann kann ich eine Entscheidung treffen, ob das die Ursache für unterschiedliche Ergebnisse ist.
Ich kann mehr Code oder Logcat oder was auch immer Sie denken, kann hilfreich sein. Danke!
Whare bereitstellen Sie Ihr Beispiel? –
lokal mit Netbeans/Tomcat, ich habe noch nicht herausgefunden, wie man es hosten – chewbapoclypse
Das @Inject ist nur eine Markierung, dass das Mitglied "injizierbar" ist. Sie benötigen ein DI-Framework, um die eigentliche Injektion zur Laufzeit durchzuführen. Verwenden Sie ein bestimmtes DI-Framework? Wenn ja, welcher? – paulk23