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