gpt4 book ai didi

java - @EJB注解为空

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:22 26 4
gpt4 key购买 nike

我试图了解 @EJB(beanName="etc") 的工作原理。我尝试使用它,并且在调用时保持为空。我在其他线程中读到我不应该使用“new ClassNameEJB()”来初始化它。我的印象是使用 @EJB 注释提供了本地私有(private)字段的初始化。这是我的实现:

Bean 类:

@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.");
}

}

我在一个类中有一个私有(private)@EJB字段,如下所示:

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

它利用了 EJB:

    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;

当它到达 errorLogLocal.logError 时,它会直接越过它。在 JBoss 9 中调试时,errorLogLocal 的值为 null。我在某个地方缺少一个步骤吗?我是否需要在容器的 xml 文件中包含一些底层结构?在某些情况下我是否必须使用 INitialContext.lookup 还是可以使用 @EJB 表示法而不进行查找?

编辑:我已将必要的元素添加到 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、Servlet 或 JSF Managed Bean 使用 @EJB。您不能从 Pojo 使用 @EJB

关于java - @EJB注解为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41244415/

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