Java EE 6 - встроенные тесты контейнера EJB - PullRequest
4 голосов
/ 15 октября 2010

Этот вопрос касается Java EE 6 , использующего glassfish v3 встроенного все .

У меня есть модульный тест, который использует EJBContainer для проверки моего EJB без сохранения состояния.Проблема в том, что у меня возникают проблемы при поиске EJB (удаленного) с использованием JNDI:

setup() {

  ctx = EJBContainer.createEJBContainer().getContext();

}

...

test() {

BookService bookService = (BookService)ctx.lookup("java:global/BookServiceEJB!com.something.service.BookService");

...

}

@Stateless
public class BookServiceEJB implements BookService {
...
}

@Remote
public interface BookService {
...
}

дает исключение:

javax.naming.NamingException: Lookup failed for 'java:global/BookServiceEJB!com.something.service.BookService' in SerialContext  [Root exception is javax.naming.NameNotFoundException: BookServiceEJB!com.something.service.BookService not found]

...

caused by: javax.naming.NameNotFoundException: BookServiceEJB!com.something.service.BookService not found

Я пробовал несколько путей к ресурсам JNDI:

например

java:global/BookServiceEJB

java:global/BookService

четные:

java:global/BookShelf-1.0-SNAPSHOT/BookServiceEJB

и т. Д. *

ничего не работает

Я не имеютxml развертывание настроенных файлов, только persistence.xml в META-INF.

В тесте используется maven surefire:

mvn clean test

Любая помощь очень ценится!

Примечание : работает полное развертывание на сервере Glassfish (с использованием appclient и @EJB инъекция)

Ответы [ 3 ]

6 голосов
/ 15 октября 2010

После долгих поисков нашел решение, которое работает для меня ...

Вам нужно настроить EJBContainer со свойством: EJBContainer.MODULES и местоположением, где находятся классы модуля (при использованииmaven, 'target / classes').

например,

...
props = new Properties();
props.put(EJBContainer.MODULES, new File("target/classes"));
ec = EJBContainer.createEJBContainer(props);
...

Если ваш EJB-компонент использует JPA, есть еще одна проблема в том, что вы не сможете определить источник данных во встроенном контейнере,поэтому нужно использовать ds по умолчанию: 'jdbc / __ default'.

. Например, мой файл persistence.xml выглядит так:

<?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    version="1.0">

    <persistence-unit name="bookshelf" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>com.blah.domain.Book</class>
        <jta-data-source>jdbc/__default</jta-data-source>
        <properties>
            <property name="eclipselink.logging.level" value="INFO"/>
        </properties>
    </persistence-unit>

</persistence> 

Я не понял, как настроитьвстроенный тест контейнера для использования одного DS (по умолчанию jdbc / __) и мое приложение для использования другого (например, jdbc / booksDS)

см. : http://www.mentby.com/glassfish/embedded-testing-woes.html

см. : http://forums.java.net/jive/thread.jspa?messageID=395759

Если честно, я не знаю, почему люди беспокоятся о Java EE, когда такие решения, как spring, намного проще ...

Это былоочень расстраивает и тратит много времени ... надеюсь, это поможет.

3 голосов
/ 26 ноября 2013

Есть несколько элементов, которые необходимо проверить, чтобы убедиться, что вы можете загрузить бин через context.lookup , избегая NamingException .

  1. Убедитесь, что у вас есть боб. Это может показаться чем-то очевидным, но я потратил много времени, пытаясь понять, почему я не смог получить экземпляр моего сервиса в тестах. Причиной было то, что я пропустил аннотацию без гражданства .

  2. Добавить модуль при создании контейнера, как указал @Dzhu. Для maven классов будет target / классов , для maven тестов будет target / test-классов .

  3. Что-то не так, если вы нашли сообщение типа SEVERE: EJB6005:No EJB modules found в консоли. Он говорит вам, что аннотированных классов не существует

  4. Взгляните на встроенную консоль Glassfish! Там вы увидите имена для поиска ваших бобов. Обратите внимание на сообщения в формате INFO: EJB5181:Portable JNDI names for EJB YourBean: [java:global/classes/YourBean!bean.package.YourBean, java:global/classes/YourBean]. Это означает, что вы можете искать ваш бин, вызывая context.lookup("java:global/classes/YourBean!bean.package.YourBean") или по более короткому имени context.lookup("java:global/classes/YourBean"), что может быть полезно, если нет конфликтов имен.

Надеюсь, это кому-нибудь поможет. Было бы очень полезно иметь эти советы.

2 голосов
/ 05 июня 2011

Я написал небольшое руководство по использованию встроенного контейнера glassfish 3.1, в котором также рассматривается вопрос о необходимости использования другого файла persistence.xml для тестов.Также исправление сбоев контейнера с помощью удаленных интерфейсов и веб-сервисов.Вы можете проверить это в http://pschyska.blogspot.com/2011/06/unit-testing-ejb-31-with-netbeans-maven.html

...