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

无法在HttpSessionListener中注入CDI@SessionScoped

都建树
2023-03-14

我有一个有状态的会话作用域(CDI)EJB,它保存有关用户会话的信息。

@Stateful
@SessionScoped
public class GestorSesion implements IGestorSesionLocal, Serializable {

  private final static long serialVersionUID = 1L;

  private static final Logger log = Logger.getLogger(GestorSesion.class.getName());

  @PostConstruct
  private void init() {
    log.info("Configurando información de usuario");
    log.info("****************************************************************************");
  }

  @Override
  public void cerrarSesion() {
  }

  @Override
  public ISessionInfo getSesionInfo() {
    return null;
  }
}

现在,我想从一个HttpSessionListener

public class GestorSesionWeb implements HttpSessionListener {


  private static final Logger log = Logger.getLogger(GestorSesionWeb.class.getName());

  @Inject
  private Instance<IGestorSesionLocal> gestorSesion;

  @Override
  public void sessionCreated(HttpSessionEvent se) {
    if (log.isLoggable(Level.FINE)) {
      log.fine("Iniciada sesión web");
    }
    gestorSesion.get().getSesionInfo();
  }

  @Override
  public void sessionDestroyed(HttpSessionEvent se) {
    if (log.isLoggable(Level.FINE)) {
      log.fine("Limpiando sesión al salir");
    }
    try {
      this.gestorSesion.get().cerrarSesion();
      if (log.isLoggable(Level.FINE)) {
        log.fine("Sesión limpiada sin problemas");
      }
    } catch (Exception e) {
      log.log(Level.WARNING, "Excepción limpiando sesión", e);
    }
  }
}

我从webapp直接访问EJB(使用@EJB注入)到我为JSF使用的bean中(它们也是CDI管理的bean)。

我面临的问题是,HttpSessionListener似乎与JSF bean处于不同的“会话范围”。创建了两个GestorSession实例;一个从JSF实例化,另一个从HttpSessionListener实例化。

我尝试通过注入实例注入bean

这个bug报告建议它应该能够正常工作(对于我的版本,bug已经解决了),但是我仍然无法回避它。我环顾四周,但我发现的是Q

使用WilFly 8.1。0和JDK 7

有什么想法吗?

共有1个答案

司空浩邈
2023-03-14

我认为你的pb来自这里:

我从webapp直接访问EJB(使用@EJB注入)到JSF bean中。

当将CDI与EJB一起使用时(例如,通过在其上放置一个@Sessionscoped),您得到了一个CDIBean,它也具有EJB特性,但不是相反。换句话说,CDI知道EJB的本质,但EJB不知道CDI。

因此,如果您想将EJB作为CDIBean注入代码中,请使用@inject而不是@EJB。从JavaEE6中,公认的良好实践是始终使用@Inject,EJB远程除外。

还要确保只使用CDI托管bean,而不是CDI和JSF托管bean的混合。

 类似资料:
  • 我在的实现类中注入的任何CDI bean都被证明为null。惰性模型实现类本身是一个CDIbean,范围。它看起来像这样: 在注入lazymodel实现bean类时,我确实在eclipse中收到了来自Java的警告。警告类似于lazymodel类bean不能被容器代理,因为它不包含非私有的无参数构造函数,并且bean不是普通的作用域bean(类似于此)。 还有一个问题,在LazyDataModel

  • 我在我的pc上使用CDI作为jsf的支持bean编写了一个应用程序,该应用程序工作得非常好。 现在我在一台新的pc上设置了所有的东西,安装了glassfish 4.1,通过将安装的jre作为jdk7从glassfish文件夹中设置eclipse kepler。 当我在我的pc上为应用程序创建一个war,并将其部署到另一台pc上的glassfish服务器上时,一切都很好。 它根本无法识别。像CDI是

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

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

  • 我有一个JAR文件,其中包含一个请求范围Bean。(一个注释为的类)。 我有另一个Web服务项目(作为WAR文件构建)。上述JAR文件位于WAR文件的文件夹中。 我试图的类到Web服务项目中的一个类中。 我正在得到一个 这两个项目都有JAR文件,WAR文件包含一个空的。我已经研究这个问题好几天了。请帮忙。 谢谢

  • 我正在使用tomcat 9.0。4和Java1.8。在同一个项目中,jersey提供了一个Web服务。我可以从webservice类中使用@Inject,没有任何问题。我正试图通过下面的websocketendpoint显示使注入工作。 这是我的CDI实现: 我得到的只是一个java。lang.NullPointerException。 我找到了这个功能请求。所以我认为注射仍然没有在tomcat中