好的,我一直关注这个关于Web套接字的tutorial,并且我理解了99%的示例代码如何工作。至于1%,它处理依赖注入。在研究DI之后,我理解为了运行,类变得依赖于类(ether本身或其他)中的对象。以下是它的使用方法。
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) {
}
...
}
据我所知,这里的理论是类#34; DeviceWebSocketServer"取决于" DeviceSessionHandler"为了运作。但是,当我运行此代码时,我在logcat中得到java.lang.NullPointerException
。
所以我发现原因是因为sessionHandler永远不会被初始化,只是挂出null并抛出Exceptions就像它们是免费的一样。是不是@Inject的目的是为了防止这种情况?我可以通过改变来阻止NPE ......
private DeviceSessionHandler sessionHandler = new DeviceSessionHandler();
但是应用程序的行为与tutorial所说的不同
Testing the Java WebSocket Home Application
Step 4:
设备已添加到Java WebSocket Home服务器,并在两个Web浏览器中呈现。
两个浏览器都没有更新。现在我不知道是因为DI工作还是其他因素。我需要帮助找出为什么依赖注入不起作用,然后我可以确定这是否是造成不同结果的原因。
我可以发布更多代码或logcat或任何您认为可能有帮助的内容。 谢谢!
答案 0 :(得分:1)
很高兴你意识到没有@Inject,你只需要为它新建一个处理程序,但是,这还不够好,你还需要静态,因为你希望所有的客户端共享相同的处理程序,然后任何一个客户端更新设备,所有其他客户端都可以看到它,我测试了它,它工作。
对于你的第二个问题,除了为该处理程序添加静态,并且由于你没有使用GlassFish,我假设您可能需要包含GlassFish“javax.json”lib,或者如果您使用maven来管理导入,你应该添加GlassFish 实现,而不是只添加声明,所以你应该添加:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.0.4</version>
</dependency>