@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>
別のejbから@EJB(beanName = "AsynchronousErrorLogEJB")を使用していますか?つまり、EJBではないクラスから@EJBを使用することはできません。あなたが言うように、コンテキストルックアップを行うことができます。 – mendieta
@mendietaその理由が必要です。したがって、EJBアノテーションは別のEJB内からのみ使用できますか? – Joshhw
はい、そうです。他にもposibilityがあります。CDIとInjectアノテーションを使ってpojoにEJBを注入しようとすることができますが、これは別の話です;) – mendieta