Java EE 6 - embedded test EJB container
-
30-09-2019 - |
Domanda
Questo è per quanto riguarda questiong Java EE 6 , con v3 GlassFish embedded-tutto .
Ho una prova di unità che utilizza EJBContainer alla prova la mia stateless EJB. Il problema è che sto avendo problemi a guardare l'EJB (remoto) utilizzando 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 {
...
}
dà l'eccezione:
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
Ho provato i percorsi di risorse diverse JNDI:
es.
java:global/BookServiceEJB
java:global/BookService
anche:
java:global/BookShelf-1.0-SNAPSHOT/BookServiceEJB
ecc ...
Nothings lavori
I non hanno alcun deployment XML file configurati, solo persistence.xml
in META-INF.
Il test utilizza Maven infallibile:
mvn clean test
Ogni aiuto è molto apprezzato!
Nota ??strong>: un deploy pieno di opere Glassfish server (utilizzando AppClient, e l'iniezione @EJB
)
Soluzione
Dopo molte ricerche, ha trovato la soluzione che funziona per me ...
Si dovrà configurare l'EJBContainer con la proprietà:. EJBContainer.MODULES, e la posizione in cui le classi sono moduli (se si utilizza Maven, 'obiettivo / classi')
es.
...
props = new Properties();
props.put(EJBContainer.MODULES, new File("target/classes"));
ec = EJBContainer.createEJBContainer(props);
...
Se il bean usa JPA, c'è un altro problema in quanto non sarà in grado di definire un DataSource nel contenitore incorporato, in modo da avere per utilizzare i ds di default:. 'JDBC / __ default'
Così, per esempio il mio aspetto persistence.xml in questo modo:
<?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>
Non ho capito come configurare il test container incorporato per utilizzare uno DS (JDBC / __ predefinita), e la mia app per utilizzare un altro (ad esempio JDBC / booksDS)
vedere : http: //www.mentby .com / GlassFish / embedded-test-woes.html
vedere : http://forums.java .net / Jive / thread.jspa? messageId = 395.759
Per essere onesti non so perché la gente dà fastidio con Java EE quando le soluzioni come la primavera è molto più semplice ...
E 'stato molto frustrante e un sacco di tempo sprecato ... speriamo che questo aiuta.
Altri suggerimenti
C'è un paio di elementi necessari per verificare, al fine di assicurarsi la possibilità di caricare il fagiolo attraverso il context.lookup evitare una NamingException .
-
Assicurarsi di avere un fagiolo. Questo può sembrare una cosa ovvia, ma ho speso un sacco di tempo a cercare di capire perché non ero in grado di ottenere un'istanza del mio servizio nelle prove. La ragione era che mi mancava il Stateless di annotazione.
-
Aggiungere il modulo durante la creazione del contenitore come @Dzhu sottolineato. Per esperto di classi sarà target / classi , per esperto di test sarà target / test-classi .
-
C'è qualcosa di sbagliato se si trova un messaggio come
SEVERE: EJB6005:No EJB modules found
nella console. Ti dice che non ci sono Stateless classi annotate -
Date un'occhiata alla console glassfish incorporato! Lì potrete vedere i nomi di ricerca per i vostri fagioli. Prestare attenzione ai messaggi in formato
INFO: EJB5181:Portable JNDI names for EJB YourBean: [java:global/classes/YourBean!bean.package.YourBean, java:global/classes/YourBean]
. Ciò significa che si può cercare il bean sia chiamandocontext.lookup("java:global/classes/YourBean!bean.package.YourBean")
o dal nomecontext.lookup("java:global/classes/YourBean")
più corto che può essere utile se non ci sono collisioni di nomi.
Spero che questo aiuti qualcuno. Sarebbe stato veramente utile per avere avuto questo suggerimenti.
Ho scritto un piccolo tutorial su come utilizzare il contenitore di 3.1 GlassFish incorporato, affrontando anche il problema per che necessitano di un persistence.xml diverso per i test. fissa anche crash contenitore con interfacce remote e webservices. È possibile controllare fuori a http: / /pschyska.blogspot.com/2011/06/unit-testing-ejb-31-with-netbeans-maven.html