Сбой при внедрении локального клиента OpenEJB

#java #jakarta-ee #dependency-injection #integration-testing #openejb

#java #джакарта-ee #внедрение зависимости #интеграция-тестирование #openejb

Вопрос:

Обратите внимание, что я очень точно повторяю приведенный здесь пример.

На самом деле, моя ситуация несколько проще, поскольку на данный момент я даже не тестирую с помощью модуля сохранения. Мой тестовый проект предоставляет простой MDB и сессионный компонент; и MDB, и сессионный компонент загружаются в обычном режиме и могут быть успешно протестированы (ограниченным образом) без внедрения.

Предложенное внедрение с @LocalClient аннотацией в моих модульных тестах завершается ошибкой с известной ошибкой:

javax.naming.NamingException: Unable to find injection meta-data for [your-class]. Ensure that class was annotated with @org.apache.openejb.api.LocalClient and was successfully discovered and deployed. See http://openejb.apache.org/3.0/local-client-injection.html

Когда я захожу на эту страницу, она сообщает мне, что мне, возможно, потребуется добавить дополнительное свойство в настройку контекста моего тестового примера. Итак, теперь это выглядит как:

 @Override
public void setUp() throws Exception {
    initializeContext();
}
  
 public void initializeContext() {
    Properties p = new Properties();
    p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
    // the property i've added
    p.put("openejb.tempclassloader.skip", "annotations");

    try {
        InitialContext initialContext = new InitialContext(p);
        initialContext.bind("inject", this);
    } catch (Throwable throwable) { 
        throwable.printStackTrace();
        throw new RuntimeException(throwable);
    }
}
  

Но это все еще сбой. Мне действительно нравится эта идиома, и я был бы очень рад, если бы смог успешно использовать ее в своих проектах.

Несколько других замечаний:

  • Я предоставляю «пустой» ejb-jar.xml (в src / main /resources) и application-client.xml (в src / test / resources), как было предложено Apache, чтобы сообщить OpenEJB о проверке пути к классу [ОБНОВЛЕНИЕ: как оказалось, я делал это неправильно. Смотрите мой ответ ниже для предложения, которое сработало для меня.]
  • Тестовые примеры, аннотированные с помощью @LocalClient , не идентифицируются движком OpenEJB как фактически подобранные и обработанные должным образом (как, например, мои MDB)

Заранее спасибо за любую помощь или руководство.

Ответ №1:

Эта проблема, вероятно, вызвана неправильным расположением дескрипторов, которые указывают OpenEJB, какие типы модулей доступны.

Чтобы убедиться, что тестовые классы подобраны правильно, убедитесь, что вы размещаете файл с именем application-client.xml at src/test/resources/META-INF со следующим содержимым:

<application-client/>

Это должно заставить OpenEJB сканировать и реагировать на наличие @LocalClient аннотаций.

Комментарии:

1. Рад, что вы нашли проблему, и дважды благодарю за публикацию ответа. Я отправил JIRA для улучшения, где мы могли бы добавить это в список того, что мы могли бы проверить issues.apache.org/jira/browse/OPENEJB-1570

2. Обратите внимание, что @LocalClient больше не требуется в OpenEJB 4, равно как и какие-либо дескрипторы развертывания. Еще не выпущен, но выглядит действительно хорошо. Нам нужно немного продвинуться в поддержке CDI, а затем запустить бета-версию.

Ответ №2:

У меня была похожая проблема, когда я пытался протестировать материал в тестовом проекте под названием tomee-embedded-trial, и оказалось, что openejb игнорирует материал с именем tomee-.* .

Я исправил это для себя, указав следующие системные свойства: openejb.deployments.classpath.include=".*-trial.*" openejb.deployments.package.include=".*-trial.*"