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 : un deploy pieno di opere Glassfish server (utilizzando AppClient, e l'iniezione @EJB)

È stato utile?

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 .

  1. 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.

  2. 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 .

  3. 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

  4. 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 chiamando context.lookup("java:global/classes/YourBean!bean.package.YourBean") o dal nome context.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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top