2016-12-20 5 views
1

@EJB(beanName = "etc")の仕組みを理解しようとしています。私はそれを使用しようとしましたが、呼び出されたときはnullのままです。私はそれを初期化するために "新しいClassNameEJB()"を使用すべきではないことを他のスレッドで読みました。 @EJBアノテーションを使用すると、ローカルプライベートフィールドの初期化が行われるという印象を受けています。ここに私の実装は以下のとおりです。@EJB annotation null

Beanクラス:私はクラスでプライベート@EJBフィールドのような書かれている

@Stateless(name = "AsynchronousErrorLog") 
@TransactionManagement(TransactionManagementType.BEAN) 
public class AsynchronousErrorLogEJB { 

@PersistenceContext(unitName = "errorLog") 
EntityManager entityManager; 
@Resource 
private EJBContext context; 
private static final Logger LOG = Logger.getLogger(AsynchronousErrorLogEJB.class); 


/** 
* logError: method to store error within the database 
* @param errorLog: log to be persisted to the database 
*/ 
@Asynchronous 
public void logError(final ErrorLog errorLog) { 
    try { 
     LOG.debug("Entering logError"); 
     context.getUserTransaction().begin(); 
     entityManager.persist(errorLog); 
     context.getUserTransaction().commit(); 
    } catch (final Exception e) { 
     LOG.secureError("Exception while logging error during transaction", e); 
     try { 
      context.getUserTransaction().rollback(); 
     } catch (final Exception e1) { 
      LOG.secureError("Could not rollback transaction", e1); 
     } 
    } 
    LOG.debug("error logging complete."); 
} 

} 

:などのEJBを利用

@EJB(beanName="AsynchronousErrorLogEJB") 
private AsynchronousErrorLogEJB errorLogLocal; 

try { 
     ErrorLog eLog = new ErrorLog(e, ServerName.getServerName()); 
     errorLogLocal.logError(eLog); 
    } catch (GeneralException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

私はこのEJBのテーブル構造を次のようにしています:

@Entity(name="ERROR_LOG") 
public class ErrorLog { 

    @Id 
    @Column(name="ERROR_LOG_ID") 
    private String errorLogId; 
    @Column(name="ERROR_MESSAGE") 
    private String errorMessage; 
    @Column(name="TIMESTAMP") 
    private Date timeStamp; 
    @Column(name="SERVER_NAME") 
    private String serverName; 
    @Column(name="STACK_TRACE") 
    private String stackTrace; 

エラーLogLocal.logErrorになると、すぐ上に進みます。 JBoss 9でデバッグするとき、errorLogLocalの値はnullです。私はどこかで行方不明のステップがありますか?コンテナへのXMLファイルにいくつかの基本構造を含める必要がありますか?いくつかのインスタンスでINitialContext.lookupを使用する必要がありますか、またはルックアップなしで@EJB表記を使用できますか?

EDIT:PersistenceContextのpersistence.xml(META-INF)ファイルに必要な要素を追加しました。私は、そのが正しく実装されている場合はわからないが、私は以前の実装と一緒に続く:

<persistence-unit name="errorLog"> 
     <non-jta-data-source>java:/jdbc/STOMP</non-jta-data-source> 
     <class>com.ens.stomp.message.log.ErrorLog</class> 
     <properties> 
      <property name="hibernate.archive.autodetection" value="false" /> 
     </properties> 
    </persistence-unit> 

</persistence> 
+1

別のejbから@EJB(beanName = "AsynchronousErrorLogEJB")を使用していますか?つまり、EJBではないクラスから@EJBを使用することはできません。あなたが言うように、コンテキストルックアップを行うことができます。 – mendieta

+0

@mendietaその理由が必要です。したがって、EJBアノテーションは別のEJB内からのみ使用できますか? – Joshhw

+0

はい、そうです。他にもposibilityがあります。CDIとInjectアノテーションを使ってpojoにEJBを注入しようとすることができますが、これは別の話です;) – mendieta

答えて

0

あなたがEJBから@EJBを使用していることを確認し、サーブレットまたはJSF管理対象Bean ..あなたが使用can't @EJB Pojoから