有人能帮帮我吗?有一个SessionScoped Managed Bean和一个Stateless Ejb以及另一个Stateful Ejb ..
MB中的serachCustomer()方法调用注入的DaoEjbTst searcCustomer()方法,该方法返回带有BCus实体对象的实例。我向Stateless DaoEjbTst Ejb注入了另一个Stateful CustomerSession EJB,当DaoEjbTst EJB中的实体实例准备就绪时,我调用了CustomerSession EJB setActualCustomer方法,并给出了该方法的实体实例的参数,并尝试存储它......然后当我试图在ManagedBean中使用另一个showTstDate()方法获取这个“存储”实体实例时,它会抛出NullPointer异常。而且我不知道为什么..为什么不存在有状态ejb中的公共BCus actualCustomer参数?我试图在Stateful Ejb中创建@PreDestroy和@PrePassivate以及@Remove方法来检查容器是否删除它但是这个方法从未被容器调用过..所以我确定ejb存在..但是尽管如此我可以访问它:(我不使用接口。
这是我的托管bean:
@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();
}
这是我的DaoEjbTst:
@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;
}
}
这是我的CustomerSession EJb:
@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() {
}
}
答案 0 :(得分:0)
我认为在ManagedBean中注入的CustomerSession bean不是在DaoEjbTst中注入的相同bean实例。所以调用:
customerSession.getActualCustomer()
ManagedBean中的只返回null,因为没有为此特定bean实例设置ActualCustomer字段。它是在DaoEjbTest中设置的,但这是CustomerSession的不同实例。所以:
DaoEjbTst.getCustomerSession().equals(ManagedBean.getCustomerSession())
给出错误。
当您查看规范EJB 3.1(第3.4.7.1节)时,您会看到:
有状态会话对象具有唯一标识,该标识由对象在对象时分配 创建。
基本上你应该做的是使用在DAO的searcCustomer()方法中找到的值为ManagedBean中的CustomerSession bean实例设置setActualCustomer。但是,在无状态bean中存储有状态会话bean是一个非常糟糕的主意,我建议你重新考虑你的架构。