2

私はJava EEとJSPを学んでいます。NetBeans でエンタープライズ アプリケーション プロジェクトを作成しました。EJB projectすべての Bean がある場所と、すべてWAR projectの Web/クライアントのものがある場所があります。私の問題は、注釈@EJBが WAR アプリケーションで Bean をインスタンス化しないことです。@EJBEJB アプリケーションの外部で使用できますか?

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 オブジェクトがインスタンス化されないことです。customerRemote@EJB アノテーションは、常に 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);
//    }
}
4

1 に答える 1

1

@EJBアノテーションは、クラスがコンテナー管理、つまり EJB、サーブレット、JSP である場合にのみ機能します...あなたの場合、それをプレーンな古い Java オブジェクト (POJO) に入れるため、経験したように注入は機能しません。CustomerProxyBean をステートレス セッション Bean として記述すると、変更が表示されます。

または、何らかの理由で JNDI を回避したい場合は、CDI と@Injectアノテーションを使用して EJB を注入し、POJO でも目的の動作を実現できます。

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