@EJB注释为null

时间:2016-12-20 14:16:58

标签: java java-ee jboss ejb

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

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

}

我在课堂上有一个私人的@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> 

1 个答案:

答案 0 :(得分:0)

确保您使用的是EJB,Servlet或JSF Managed Bean中的@EJB ..您无法使用Pojo中的@EJB