Question

Cette questiong est au sujet de Java EE 6 , en utilisant GlassFish v3 embarqués tous .

J'ai un test unitaire qui utilise EJBContainer pour tester mon EJB sans état. Le problème est que je ne parviens pas à la recherche EJB (à distance) en utilisant 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 {
...
}

donne l'exception:

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

Je l'ai essayé plusieurs chemins de ressources JNDI:

par exemple.

java:global/BookServiceEJB

java:global/BookService

même:

java:global/BookShelf-1.0-SNAPSHOT/BookServiceEJB

etc ...

œuvres de Nothings

ne pas le déploiement xml fichiers configurés, seulement persistence.xml dans META-INF.

Le test utilise Maven Surefire:

mvn clean test

Toute aide est grandement appréciée!

Remarque : deploy complet serveur fonctionne Glassfish (en utilisant appclient et injection @EJB)

Était-ce utile?

La solution

Après beaucoup de recherche, a trouvé la solution qui fonctionne pour moi ...

Vous devrez configurer le EJBContainer avec la propriété. EJBContainer.MODULES, et l'endroit où les classes du module sont (si vous utilisez Maven, 'target / classes')

par exemple.

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

Si votre EJB utilise JPA, theres un autre problème que vous ne serez pas en mesure de définir une source de données dans le conteneur embarqué, doivent donc utiliser la valeur par défaut ds:. « Jdbc / __ default »

donc par exemple mon apparence persistence.xml comme ceci:

<?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> 

Je n'ai pas compris comment configurer le test de conteneur embarqué à utiliser une DS (jdbc / __ par défaut), et mon application à utiliser un autre (par exemple jdbc / booksDS)

voir : http: //www.mentby .com / GlassFish / test-intégré-woes.html

voir : http://forums.java .net / Jive / thread.jspa? messageID = 395759

Pour être honnête, je ne sais pas pourquoi les gens dérangent avec Java EE lorsque des solutions comme le printemps est tellement plus simple ...

Il a été très frustrant et beaucoup de temps perdu ... espérons que cette aide.

Autres conseils

Il y a quelques éléments que vous devez vérifier afin de vous assurer que vous pouvez charger le grain par la context.lookup éviter une NamingException .

  1. Assurez-vous que vous avez un haricot. Cela peut sembler une évidence, mais j'ai passé beaucoup de temps à essayer de comprendre pourquoi je n'ai pas pu obtenir une instance de mon service dans les tests. La raison était que je manque Stateless annotation.

  2. Ajoutez le module lors de la création du conteneur comme @Dzhu souligné. Pour maven les classes seront cours cible / , pour maven Tests seront cible / test-classes .

  3. Quelque chose ne va pas si vous trouvez un message comme SEVERE: EJB6005:No EJB modules found dans la console. Il vous dit qu'il n'y a pas Stateless classes annotées

  4. Jetez un oeil à la console GlassFish embarqué! Là-dedans, vous verrez les noms de consultation pour vos haricots. Faites attention aux messages dans le format INFO: EJB5181:Portable JNDI names for EJB YourBean: [java:global/classes/YourBean!bean.package.YourBean, java:global/classes/YourBean]. Cela signifie que vous pouvez rechercher votre bean soit en appelant context.lookup("java:global/classes/YourBean!bean.package.YourBean") ou par le nom plus court context.lookup("java:global/classes/YourBean") qui peut être utile s'il n'y a pas de collision de nom.

Espérons que cela aide quelqu'un. Il aurait été très utile d'avoir eu des conseils.

J'ai écrit un petit tutoriel sur l'utilisation du conteneur GlassFish 3.1 intégré, prenant en considération le problème pour avoir besoin d'un autre persistence.xml pour les tests. fixant également les accidents de conteneurs avec des interfaces distantes et webservices. Vous pouvez le vérifier à http: / /pschyska.blogspot.com/2011/06/unit-testing-ejb-31-with-netbeans-maven.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top