Вопрос

Этот вопрос считает 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

так далее...

Nothings работает

я не имеют никакого развертывания XML Настроен файлы, только persistence.xml в мета-инф.

Тест использует Maven Surefire:

mvn clean test

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

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

Это было полезно?

Решение

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

Вам придется настроить EJBContainer с свойством: EJBContainer.modules и местоположение, где классы модуля (при использовании Maven, «Цель / классы»).

например

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

Если ваш EJB использует JPA, есть другая проблема в том, что вы не сможете определить DataSource в встроенном контейнере, поэтому приходится использовать DS по умолчанию: «JDBC / __ default».

Так, например, моя настойчивость .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 / Bootsds)

видеть: http://www.mentby.com/glassfish/embedded-testing-woes.html.

видеть: http://forums.java.net/jive/thread.jspa?messageId=395759.

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

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

Другие советы

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

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

  2. Добавьте модуль при создании контейнера, как указал @dzhu. Для Maven классы будет цель/классы, для Maven тесты будет цель/тестовые классы.

  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") которые могут быть полезны, если нет никаких коллизий.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top