好的,我一直在遵循这个关于Web Sockets的教程,并且我理解99%的示例代码是如何工作的。至于那1%,它处理的是依赖注入。在研究了DI之后,我了解到,为了实现功能,类依赖于来自类的对象(无论是自身还是其他对象)。以下是它的用法:
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) {
}
...
}
我理解,这里的理论是类"DeviceWebSocketServer"是依赖于"DeviceSessionHandler"为了功能。然而,当我运行这段代码时,我在日志中得到java.lang.NullPointerException
。
所以我发现,原因是因为sessionHandler从来没有初始化,只是挂出来是空的,抛出异常,就像他们是自由的。@Inject的目的不就是为了防止这种情况吗?我可以通过更改....
来防止NPEprivate DeviceSessionHandler sessionHandler = new DeviceSessionHandler();
但是应用程序在
下的行为就不像教程说的那样了Testing the Java WebSocket Home Application
Step 4:
添加设备到Java WebSocket Home server,并在两个浏览器中呈现。
两个浏览器都没有更新。我不知道这是因为DI的作用,还是其他因素。我需要帮助弄清楚为什么依赖注入不起作用,然后我可以确定这是否是导致不同结果的原因。
我可以张贴更多的代码或日志或任何你认为可能有帮助的。谢谢!
很高兴您意识到没有@Inject,您只需要为它创建一个处理程序,但是,这还不够好,您还需要静态,因为您希望所有客户端共享相同的处理程序,然后任何客户端更新设备,所有其他客户端都可以看到它,我测试了它,它工作了。
对于你的第二个问题,除了为该处理程序添加静态之外,由于你没有使用GlassFish,我认为你可能需要包括GlassFish"javax"。或者如果你使用maven来管理导入,你应该添加GlassFish 实现,而不仅仅是声明,所以你应该添加:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.0.4</version>
</dependency>