Dependecy Injection导致空指针异常

时间:2016-06-29 21:44:21

标签: java dependency-injection websocket

好的,我一直关注这个关于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或任何您认为可能有帮助的内容。 谢谢!

1 个答案:

答案 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>