【问题标题】:Cannot use @EJB to instantiate my object in the WAR application无法使用 @EJB 在 WAR 应用程序中实例化我的对象
【发布时间】:2012-12-16 13:21:47
【问题描述】:

我正在学习 Java EE 和 JSP。我在 NetBeans 中创建了一个企业应用程序项目。 我有一个 EJB project 和一个 WAR project ,其中所有的 bean 都在其中。 我的问题是注释 @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);
//    }
}

【问题讨论】:

    标签: java jsp ejb java-ee-6


    【解决方案1】:

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

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

    @Inject
    private CustomerRemote customerRemote;
    

    【讨论】:

    • 那么CustomerProxyBean 不是容器管理的吗?我试图将@Stateless 注释放在类声明上方,但没有帮助。
    • CustomerProxyBean 不是容器管理的,因为它没有实现任何接口并且没有正确注释。您使用的是哪个 Java EE 版本?在 Java EE 6 中,您可以不实现任何接口,但是除了 @Stateless 之外,您还必须添加 @LocalBean 注释。否则,实现本地或远程接口,就像在 CustomerBean bean 中所做的那样。
    • 编辑:即使没有@LocalBean 注释也可以使用(在这两种情况下您都将拥有无接口视图),但关键是您正在使用的 Java EE 和 EJB 版本。在 Java EE 6/EJB 3.1 的情况下,@Stateless 应该足以使您的类无状态会话 bean,否则您还必须实现本地或远程接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 2011-08-17
    • 2013-07-31
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多