Frage

Dieses questiong ist in Bezug auf Java EE 6 , mit v3 Glassfish eingebettet-all .

Ich habe einen Unit-Test, die EJBContainer verwendet meinen stateless EJB zu testen. Das Problem ist, Ich habe Probleme die EJB aufzublicken (remote) mit 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 {
...
}

gibt die Ausnahme:

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

Ich habe mehrere JNDI Ressource Wege versucht:

z.

java:global/BookServiceEJB

java:global/BookService

auch:

java:global/BookShelf-1.0-SNAPSHOT/BookServiceEJB

etc ...

nothings Werke

I hat kein XML Deployment Dateien konfigurieren, nur ein persistence.xml in META-INF.

Der Test wird unter Verwendung von Maven todsicheren:

mvn clean test

Jede Hilfe sehr geschätzt!

Hinweis : eine vollständige deploy auf Glassfish-Server arbeitet (mit appclient und @EJB Injektion)

War es hilfreich?

Lösung

Nach langer Suche fand die Lösung, die für mich funktioniert ...

Sie müssen die EJBContainer mit der Eigenschaft konfigurieren:. EJBContainer.MODULES, und die Stelle, wo die Modulklassen sind (wenn Maven, ‚Soll / Klassen‘)

z.

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

Wenn Ihr EJB JPA verwendet, gibt ein weiteres Problem darin, dass Sie nicht eine Datenquelle in dem eingebetteten Behälter definieren Lage sein, so die Standard-ds verwenden müssen. ‚Jdbc / __ default‘

so zum Beispiel meines persistence.xml sieht so aus:

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

Ich habe nicht herausgefunden, wie den eingebetteten Container-Test zu konfigurieren, einen DS zu verwenden (jdbc / __ Standard), und meine Anwendung ein anderes zu verwenden (zum Beispiel jdbc / booksDS)

sehen : http: //www.mentby .com / Glassfish / embedded-Test-woes.html

sehen : http://forums.java .net / jive / thread.jspa? messageID = 395.759

Um ehrlich zu sein, weiß ich nicht, warum die Leute mit Java EE stören, wenn Lösungen wie der Frühling so viel einfacher ist ...

Es war sehr frustrierend und viel Zeit verschwendet ... hoffe, das hilft.

Andere Tipps

Es gibt einige Elemente, die Sie brauchen, um zu überprüfen, um sicherzustellen, können Sie die Bohne durch die laden context.lookup Vermeidung einer NamingException .

  1. Stellen Sie sicher, haben Sie eine Bohne. Das klingt vielleicht etwas offensichtlich aber ich habe versucht, eine Menge Zeit, um herauszufinden, warum ich nicht in der Lage war, eine Instanz meines Dienstes in den Tests zu erhalten. Der Grund war, dass ich fehlte die Stateless Anmerkung.

  2. Sie das Modul hinzufügen, wenn der Behälter zu schaffen als @Dzhu hingewiesen. Für Maven Klassen wird target / Klassen , für Maven Tests wird target / Test-Klassen .

  3. Etwas ist falsch, wenn Sie eine Meldung wie SEVERE: EJB6005:No EJB modules found in der Konsole finden. Es sagt Ihnen, dass es keine Stateless kommentierten Klassen

  4. Werfen Sie einen Blick auf die eingebettete Glasfischen Konsole! Dort finden Sie den Lookup-Namen für Ihre Bohnen zu sehen. Achten Sie auf die Nachrichten im Format INFO: EJB5181:Portable JNDI names for EJB YourBean: [java:global/classes/YourBean!bean.package.YourBean, java:global/classes/YourBean]. Das bedeutet, dass können Sie Ihre Bohne Nachschlag entweder durch context.lookup("java:global/classes/YourBean!bean.package.YourBean") oder durch den kürzeren Namen context.lookup("java:global/classes/YourBean") Aufruf, die nützlich sein kann, wenn es keine Namenskollisionen ist.

Hope dies hilft jemand. Es wäre sehr hilfreich gewesen, diese Tipps gehabt zu haben.

Ich habe ein kleines Tutorial geschrieben über die Verwendung der eingebetteten Glassfish 3.1 Behälter, auch mit der Frage für einen anderen persistence.xml für Tests benötigen. Auch Befestigungs Behälter stürzt mit Remote-Schnittstellen und Webservices. Sie können es heraus unter http: / /pschyska.blogspot.com/2011/06/unit-testing-ejb-31-with-netbeans-maven.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top