Pregunta

Esto es con respecto a questiong Java EE 6 , con GlassFish v3 incrustado todo .

Tengo una prueba de unidad que utiliza EJBContainer poner a prueba mi EJB sin estado. El problema es que estoy teniendo problemas para buscar el EJB (remoto) utilizando 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 {
...
}

da la excepción:

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

He intentado varios caminos de recursos JNDI:

por ejemplo.

java:global/BookServiceEJB

java:global/BookService

incluso:

java:global/BookShelf-1.0-SNAPSHOT/BookServiceEJB

etc ...

Nothings obras

no tienen ningún despliegue XML archivos configurados, sólo persistence.xml en META-INF.

La prueba está utilizando Maven segura:

mvn clean test

Cualquier ayuda es muy apreciada!

Nota: : un despliegue completo a las obras servidor GlassFish (usando appclient, y la inyección @EJB)

¿Fue útil?

Solución

Después de mucho buscar, encontrar la solución que funciona para mí ...

tendrá que configurar el EJBContainer con la característica:. EJBContainer.MODULES, y el lugar donde las clases del módulo son (si se utiliza Maven 'target / classes')

por ejemplo.

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

Si su EJB utiliza JPA, theres otro problema en que usted no será capaz de definir un origen de datos en el contenedor integrado, por lo que tiene que utilizar el DS por defecto:. 'Jdbc / __ default'

Así, por ejemplo mi aspecto persistence.xml este 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> 

No he encontrado la manera de configurar el contenedor de prueba incorporado para usar uno DS (JDBC / __ por defecto), y mi aplicación para utilizar otro (por ejemplo, jdbc / booksDS)

ver http: //www.mentby .com / glassfish / pruebas incrustado-woes.html

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

Para ser honesto, no sé por qué la gente se molesta con Java EE cuando las soluciones como la primavera es mucho más simple ...

Ha sido muy frustrante y una gran cantidad de tiempo perdido ... espero que esta ayuda.

Otros consejos

Hay algunos elementos que necesita para comprobar el fin de asegurarse de que puede cargar el grano a través de la Context.lookup evitar un NamingException .

  1. Asegúrate de que tienes un grano. Esto puede parecer algo obvio pero pasado mucho tiempo tratando de averiguar por qué yo no era capaz de obtener una instancia de mi servicio en las pruebas. La razón era que me estaba perdiendo la Sin estado anotación.

  2. Añadir el módulo al crear el contenedor como @Dzhu señaló. Para experta clases será target / clases , para el experto en pruebas será target / prueba-clases .

  3. Algo está mal si encuentra un mensaje como SEVERE: EJB6005:No EJB modules found en la consola. Le dice que no hay sin estado clases anotadas

  4. Tome un vistazo a la consola glassfish incrustado! Allí podrás ver los nombres de consulta para sus granos. Prestar atención a los mensajes en el formato INFO: EJB5181:Portable JNDI names for EJB YourBean: [java:global/classes/YourBean!bean.package.YourBean, java:global/classes/YourBean]. Eso significa que usted puede buscar el bean ya sea llamando o context.lookup("java:global/classes/YourBean!bean.package.YourBean") por el context.lookup("java:global/classes/YourBean") nombre más corto que puede ser útil si no hay conflictos de nombres.

Espero que esto ayude a alguien. Hubiera sido de gran ayuda haber tenido este consejos.

He escrito un pequeño tutorial sobre el uso del contenedor glassfish 3.1 incorporado, también abordar la cuestión de la necesidad de un persistence.xml diferente para las pruebas. También la fijación de los accidentes de contenedores con interfaces remotas y webservices. Puede comprobarlo en http: / /pschyska.blogspot.com/2011/06/unit-testing-ejb-31-with-netbeans-maven.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top