2016-06-29 7 views
3

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!

+0

Whare bereitstellen Sie Ihr Beispiel? –

+0

lokal mit Netbeans/Tomcat, ich habe noch nicht herausgefunden, wie man es hosten – chewbapoclypse

+1

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

Antwort

1

Froh, dass Sie erkannt haben, dass Sie ohne @Inject einfach einen neuen Handler dafür brauchen, aber das ist nicht gut genug, Sie brauchen auch statische dafür, weil Sie wollen, dass alle Clients den gleichen Handler teilen, dann alle Der Client aktualisiert das Gerät, alle anderen Clients können es sehen, ich habe es getestet, es hat funktioniert.

Für Ihre zweite Frage, neben dem Hinzufügen von statischen für diesen Handler, und da Sie nicht GlassFish verwenden, nehme ich an, Sie müssen die GlassFish "javax.json" -Bibliothek einschließen, oder wenn Sie Maven verwenden, um die Importe zu verwalten , sollten Sie die Glassfish Implementierung, statt nur Erklärung, hinzufügen, so sollten Sie hinzufügen:

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.json</artifactId> 
    <version>1.0.4</version> 
</dependency> 
+1

Ich habe die Ursache gefunden, indem Sie den Code debuggen, hoffe, dass dies helfen kann. – ccjli

+0

Dank James Ich endete nicht mit Tomcat und stattdessen mit GlassFish und landete in eine ganz neue Dose Würmer, wenn ich versuchte, mich remote an der Admin-Konsole anmelden, und konnte nur Updates über CLI und Shell-Befehle, aber ich werde gehe zurück und überprüfe das – chewbapoclypse

+0

überhaupt kein Problem, und bitte immer daran denken, verschiedene Container bedeutet einfach andere Implementierung von einigen API, und wenn Sie einige Lib in einem Container fehlt, finden Sie es einfach irgendwo und fügen Sie es zu Ihrem Klassenpfad . Möge die Macht mit dir sein. – ccjli