Java 依赖注入导致空指针异常

Java 依赖注入导致空指针异常,java,dependency-injection,websocket,Java,Dependency Injection,Websocket,好的,我一直在关注这篇关于Web套接字的文章,我理解了99%的示例代码的工作原理。至于1%,它处理依赖注入。在研究DI之后,我了解到类依赖于类中的对象(以太本身或其他对象)来运行。下面是它的用法 package org.example.websocket; ... import javax.websocket.server.ServerEndpoint; import javax.inject.Inject; @ApplicationScoped @ServerEndpoint("/acti

好的,我一直在关注这篇关于Web套接字的文章,我理解了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”才能正常工作。然而,当我运行这段代码时,我在logcat中得到了
java.lang.NullPointerException

所以我发现原因是sessionHandler从未初始化,只是挂起为null并抛出异常,就像它们是自由的一样。@Inject的目的不是为了防止这种情况吗?我可以通过改变…来预防NPE

private DeviceSessionHandler sessionHandler = new DeviceSessionHandler();
但是,应用程序的行为与
下所说的不一样
测试Java WebSocket Home应用程序

步骤4:
将设备添加到Java WebSocket Home server,并在两种web浏览器中呈现

两个浏览器都不会更新。现在我不知道这是因为DI的工作环境,还是其他因素。我需要帮助找出依赖注入不起作用的原因,然后我可以确定这是否是导致不同结果的原因

我可以发布更多的代码或logcat或任何你认为有帮助的东西。
谢谢

很高兴你意识到,如果没有@Inject,你只需要为它新建一个处理程序,但是,这还不够好,你还需要静态处理程序,因为你希望所有客户端共享同一个处理程序,然后任何客户端更新设备,所有其他客户端都可以看到它,我测试了它,它成功了

对于第二个问题,除了为该处理程序添加静态之外,由于您没有使用GlassFish,我假设您可能需要包含GlassFish“javax.json”库,或者如果您使用maven来管理导入,您应该添加GlassFish实现,而不是仅添加声明,所以你应该加上:

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

玻璃鱼
javax.json
1.0.4

您在部署什么示例?在本地使用Netbeans/Tomcat,我还没有弄清楚如何托管它,@Inject只是一个标记,表明该成员是“可注入的”。您需要一个DI框架来在运行时执行实际的注入。您是否使用特定的DI框架?如果是,哪一个?Tomcat不支持CDI本机。本教程使用Glassfish,它确实如此,但不会改变任何东西。看,但我不确定websocket是否会得到支持。你最好使用一个完整的Java EE服务器,如Glassfish、Wildfly等。我通过调试代码找到了根本原因,希望这能有所帮助。感谢James,我最终没有使用Tomcat,而是使用Glassfish,并在尝试远程登录管理控制台时遇到了一个全新的蠕虫,并且只能通过CLI和shell命令推送更新,但我将回顾并检查这一点毫无问题,请始终记住,不同的容器只是意味着某些API的不同实现,如果一个容器中缺少某些库,只需在某处找到它并将其添加到类路径。愿原力与你同在。