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

状态完整的Ejb和会话作用域的托管bean注入空指针

祝灼光
2023-03-14

有人能帮我吗?有一个SessionScoped托管Bean和一个无状态Ejb和另一个有状态Ejb。

MB中的serachCustomer()方法调用注入的DAOEJBTSTSearcCustomer()方法,该方法返回BCus实体对象的实例。我向无状态的DaoEjbTst Ejb注入了另一个有状态的CustomerSession Ejb,当实体实例在DaoEjbTst Ejb中准备好时,我调用CustomerSession Ejb setActualCustomer方法,并作为paramter为该方法提供实体实例,并尝试存储它...然后,当我试图用ManagedBean中的另一个showTstDate()方法获取这个“存储的”实体实例时,它会抛出NullPointer异常…我不知道为什么..为什么在有状态EJB中不存在公共BCus actualCustomer paramter?我尝试在有状态Ejb中创建@predestroy和@prepassivate和@remove方法,以检查容器是否删除它,但容器从未调用这些方法。所以我确信ejb存在…但尽管如此,我无法访问它:(我不使用接口。

下面是我的ManagedBean:

@EJB
private DaoEjbTst daoEjb;

@EJB
private CustomerSession customerSession;

    public void serachCustomer() throws IOException {
        FacesContext ctx = FacesContext.getCurrentInstance();
        if (daoEjb.searcCustomer(custNo)) {

            ctx.getExternalContext().redirect("showCustomer.xhtml");

        }
        else {
             ctx.getExternalContext().redirect("test.xhtml");
        }

    }

    public String showTstDate() {
        log.info("MB EJB EXIST: " + customerSession);
        return "Test: " + customerSession.getActualCustomer().getCustName();

    }
@Stateless
public class DaoEjbTst {

    private final Logger log = Logger.getLogger("DaoEjbTst.class");

    @EJB
    private CustomerSession customerSession;

    public CustomerSession getCustomerSession() {
        return customerSession;
    }

    public void setCustomerSession(CustomerSession customerSession) {
        this.customerSession = customerSession;
    }


    @PersistenceContext(unitName = "TestAppPU")
    private EntityManager em;


    public boolean searcCustomer(String custNo) {


        try {
        BCus cus = (BCus) em.createNamedQuery("BCus.findByCustomerno").setParameter("customerno", custNo).getSingleResult();
            log.info("DAOEJB: " + cus);
        customerSession.setActualCustomer(cus);
        return true;
        }
        catch (NoResultException e) {
            log.info(e.getMessage());
        return false;
        }


    }
@Stateful
public class CustomerSession {

    public BCus actualCustomer;

    private final Logger log = Logger.getLogger("CustomerSession.class");

    public BCus getActualCustomer() {
        return actualCustomer;
    }

    public void setActualCustomer(BCus actualCustomer) {
        this.actualCustomer = actualCustomer;
        checkTst();
    }

    public CustomerSession() {
    }



}

共有1个答案

司徒高寒
2023-03-14

我认为ManagedBean中注入的CustomerSession bean与DAOEJBTST中注入的bean实例不同。因此调用:

customerSession.getActualCustomer()

在ManagedBean中,由于没有为这个特定的bean实例设置ActualCustomer字段,因此只返回null。它是在DaoEjbTest中设置的,但这是CustomerSession的不同实例。所以:

DaoEjbTst.getCustomerSession().equals(ManagedBean.getCustomerSession())

给出假的。

 类似资料:
  • 对于有状态会话bean(SFSB)和无状态会话bean(SLSB)的用法,我有点困惑。 我知道SFSB与客户保持状态。这很有帮助:什么时候使用有状态会话bean而不是无状态会话bean? 这里和许多其他地方提供的示例是SFSB的购物车。 “如果一个任务需要一系列方法调用(不止一次),并且您需要保留以前的结果以在下一次调用中使用它们,那么就可以使用SFSB”--Source。这将更像是签出(页面之间

  • 我正在学习j2ee,如果问题看起来很基本请原谅。 在httpsession中,会话ID存储在客户端,与之相关的数据存储在服务器端。 现在,当我在POJO上使用CDI@SessionScoped时,这是否意味着EJB容器(?)在会话中存储pojo。(Session.SetAttribute(POJO)) CDI可以区分SFB、SLB和POJO吗?

  • 我一直在研究很多类似的问题,这些问题并没有反映我的确切问题。如果我忽略了有人已经解决了这个问题,请让我知道。 我目前正在将JBoss 3.x上的旧EJB2.1应用程序迁移到JBoss 7.x上EJB3.x。由于应用程序客户端和服务器之间通信的变化,我创建了一个小的testclient来检查缺陷。 其中之一是我的无状态会话bean中的entitymanager没有被注入,使entitymanager

  • 问题内容: 假设我有一个实体类,汽车。 我的IDE使我可以从实体类自动生成会话bean,因此最终得到了CarFacade 我也可以生成JSF托管bean 我可以理解Entity类和其他Bean之间的有意义的区别,但是无状态会话Bean和托管Bean之间有什么区别?我读到无状态会话Bean用于实现在实体上运行的业务逻辑,而托管Bean用于通过在托管Bean上使用网页调用方法并进行托管Bean调用来与

  • 假设我有一个名为db utils的简单库,它有一个CrudService CDIBean(RequestScope),我的web应用程序使用它来执行CRUD操作。 我还有一个名为graddb的EJB项目,它从数据库映射实体。Grad db还具有用于在db utils的CrudService中设置entityManager的生产者。 我已经试过了,显然效果不错。我的问题是:这是一种糟糕的做法吗?在无

  • 问题内容: 有状态会话bean和HTTP会话之间有什么关系吗?我们将需要有状态会话Bean的用例是什么,而HTTP会话需要哪些用例。我可以将有状态会话Bean公开为静态Web服务吗? 问题答案: HTTP是一种无状态协议, 这意味着 它是服务器和客户端之间的实际传输协议- 是“无状态的, 因为它在调用之间不记得任何东西。 现在,首先阅读一下什么是HTTPSession和什么是Session Bea