gpt4 book ai didi

java - 无法使用@EJB 在 WAR 应用程序中实例化我的对象

转载 作者:行者123 更新时间:2023-11-30 11:37:48 26 4
gpt4 key购买 nike

我正在学习 Java EE 和 JSP。我在 NetBeans 中创建了一个企业应用程序项目。我有一个 EJB 项目,其中包含所有 bean,还有一个 WAR 项目,其中包含所有 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 始终为 null。但是当用 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);
// }
}

最佳答案

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

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

@Inject
private CustomerRemote customerRemote;

关于java - 无法使用@EJB 在 WAR 应用程序中实例化我的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13901674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com