当前位置: 首页 > 知识库问答 >
问题:

在Tomcat Websocket/Serverendpoint中使用CDI/注入

公西财
2023-03-14

我正在使用tomcat 9.0。4和Java1.8。在同一个项目中,jersey提供了一个Web服务。我可以从webservice类中使用@Inject,没有任何问题。我正试图通过下面的websocketendpoint显示使注入工作。

@ApplicationScoped
@ServerEndpoint("/endpoint")
public class ArchApi {

  @Inject RepClass injectedClass;

  @OnMessage()
  public String onMessage(byte[] data) {
       injectedClass.doThings("test");
  }

}

这是我的CDI实现:

    <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
        <version>2.27</version>
    </dependency>

我得到的只是一个java。lang.NullPointerException。

我找到了这个功能请求。所以我认为注射仍然没有在tomcat中实现。

我的问题是:

  • 如何将输入数据正确写入存储库
  • 有没有其他办法让注射起作用

目前我正在考虑迁移到glassfish,它应该支持从Serverendpoint注入

共有1个答案

汤洋
2023-03-14

您可以使用以下配置程序使CDI管理endpoint类:

public class CdiAwareConfigurator extends ServerEndpointConfig.Configurator {

    public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException {
        return CDI.current().select(endpointClass).get();
    }
}

然后按如下所示注释endpoint类:

@ServerEndpoint(value = "/chat", configurator = CdiAwareConfigurator.class)
public class ChatEndpoint {
    ...
}

根据您的CDI配置,您可能需要用@依赖注释endpoint类。

或者,您可以使用以下方式以编程方式查找bean实例:

SomeSortOfBean bean = CDI.current().select(SomeSortOfBean.class).get();
 类似资料:
  • 在web应用程序中,用户使用servlet HTTP会话。一些数据存储在CDI@SessionScoped bean中。在后面的一些页面中,用户浏览器和服务器之间执行WebSocket通信。 对于GlassFish 4,在GlassFish 4.0中使用WebSocket@ServerEndpoint中注入的@SessionScoped CDI bean时,会收到一条错误消息:org。jboss。

  • 文件src/main/webapp/WEB-INF/web.xml包含用于引导CDI的servlet侦听器和BeanManager引用: 通过这些设置,在使用mvn Jetty运行应用程序时,我总是遇到以下错误:run(第一行是最重要的): 应用程序正在运行,但正如异常消息所述:CDI注入在servlet中不可用。 在src/main/resources/log4j.properties中,我增加

  • 问题内容: 我试图将在Spring上下文中定义的bean注入到CDI托管组件中,但没有成功。不会注入Bean,而是在每次执行注入时都会创建一个新实例。我的环境是带有JBoss Weld的Tomcat 7。 Spring ApplicationContext很简单: CDI托管bean如下所示: 这是我的 但是,当我从JSF页面访问属性时,每次访问时都会创建一个新实例。这是一个简单的示例: 我得到以

  • 问题内容: 当前,我正在使用PersistenceContext注入EntityManager。EM被完美注入。 现在,我尝试装饰Bean,然后突然没有注入em。我得到一个NullPointerException。 我知道EJB和CDI是2个完全不同的管理器,所以一个都不知道另一个。我期望@PersistenceContext是EJB注入点,而@Inject是CDI。我应该怎么做才能解决这个问题并

  • 问题内容: 由于JPA 2.0不支持注入EntityListener(将使用JPA 2.1),因此决定使用JNDI查找来获取,并通过它来获取登录用户。我定义了一个与此类似的东西: 在会话范围内以以下方式管理用户: 我想知道这种方法有什么缺点或要注意的地方。性能吞吐量?当有多个登录用户在其自己的范围内同时更新实体时,会发生什么情况? Hibernate JPA 2.0 缝焊CDI Glassfish

  • 我有一个有状态的会话作用域(CDI)EJB,它保存有关用户会话的信息。 现在,我想从一个 我从webapp直接访问EJB(使用注入)到我为JSF使用的bean中(它们也是CDI管理的bean)。 我面临的问题是,似乎与JSF bean处于不同的“会话范围”。创建了两个实例;一个从JSF实例化,另一个从HttpSessionListener实例化。 我尝试通过注入实例注入bean 这个bug报告建议