2

我正在学习 Java EE 和 JSP。我在 NetBeans 中创建了一个企业应用程序项目。我有EJB project所有 bean 所在的位置以及WAR project所有 Web/客户端内容所在的位置。我的问题是注释@EJB没有在 WAR 应用程序中实例化我的 Bean。我可以@EJB在 EJB 应用程序之外使用吗?

在 EJB 项目中,我有这些文件:
CustomerRemote.java

@Remote
public interface CustomerRemote {
    public Customer createCustomer();
    public Customer getCustomer(int customerId);
    public void removeCustomer();
}

CustomerBean.java

@Stateless
public class CustomerBean implements CustomerRemote {

    @PersistenceContext(unitName="testPU")
    private EntityManager entityManager;

    @Override
    public Customer createCustomer() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void removeCustomer() {        
    }

    @Override
    public Customer getCustomer(int customerId) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

在 WAR 项目中,我有一个文件,我的 JSP 页面用它来与 EJB 进行通信。问题是 CustomerRemote 对象永远不会被实例化。@EJB 注释似乎不起作用,因为customerRemote始终为空。但是当使用该lookup方法实例化它时,它可以工作!那么为什么不起作用@EJB呢?

public class CustomerProxyBean {

@EJB
private CustomerRemote customerRemote;

public CustomerProxyBean() {        
//    try {
//        InitialContext context = new InitialContext();
//        customerRemote = (CustomerRemote)context.lookup("java:app/SimpleShop-ejb/CustomerBean");
//        
//    } catch (NamingException ex) {
//        Logger.getLogger(CustomerProxyBean.class.getName()).log(Level.SEVERE, null, ex);
//    }
}
4

1 回答 1

1

@EJB注释仅在您的类是容器管理的情况下才有效,即 EJB、servlet、JSP... 在您的情况下,您将其放入普通的旧 Java 对象 (POJO) 中,因此注入将不起作用,正如您所经历的那样。将您的 CustomerProxyBean 编写为无状态会话 bean,您将看到更改。

或者,如果您出于某种原因想要避免 JNDI,您可以使用 CDI 和@Inject注释来注入 EJB 并实现所需的行为,即使在 POJO 中也是如此:

@Inject
private CustomerRemote customerRemote;
于 2012-12-16T13:36:30.767 回答