2016-12-20 2 views
1

Я пытаюсь понять, как работает @EJB (beanName = "etc"). Я попытался использовать его, и когда он вызван, он остается недействительным. Я читал в других потоках, что я не должен использовать «новый ClassNameEJB()» для его инициализации. У меня создается впечатление, что использование аннотации @EJB обеспечивает инициализацию для локального частного поля. Вот мои реализации:@EJB аннотация

Bean Class:

@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 без поиска?

EDIT: Я добавил необходимые элементы в файл persistence.xml (в формате META-INF) для PersistenceContext. Я не уверен, если его должным образом реализован, но я следовал вместе с предыдущей реализации:

<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 (beanName = "AsynchronousErrorLogEJB") из другого ejb? Я имею в виду, что вы не можете использовать @EJB из класса, который не является EJB. Как вы говорите, вы можете сделать контекстный поиск, если это так, – mendieta

+0

@mendieta, который должен быть причиной. Итак, annaiton EJB может использоваться только из другого EJB? – Joshhw

+0

Да, это правильно .. Есть и другая возможность. Вы можете попробовать ввести EJB в pojo, используя аннотацию CDI и Inject, но это совсем другая история;) – mendieta

ответ

0

Убедитесь, что вы используете @EJB из EJB, сервлетов или JSF Managed Bean .. вы не можете использовать @EJB от Pojo