Java EE 6 - conteneur embarqué tests EJB
-
30-09-2019 - |
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
)
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 .
-
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.
-
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 .
-
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 -
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 appelantcontext.lookup("java:global/classes/YourBean!bean.package.YourBean")
ou par le nom plus courtcontext.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