4

这个问题是关于Java EE 6的,使用glassfish v3 embedded-all

我有一个使用 EJBContainer 来测试我的无状态 EJB 的单元测试。问题是我无法使用 JNDI 查找 EJB(远程):

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 {
...
}

给出了例外:

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

我尝试了几个 JNDI 资源路径:

例如

java:global/BookServiceEJB

java:global/BookService

甚至:

java:global/BookShelf-1.0-SNAPSHOT/BookServiceEJB

ETC...

没什么用

没有配置任何 xml 部署文件,只有persistence.xmlMETA-INF 中的一个。

测试使用 maven surefire:

mvn clean test

任何帮助是极大的赞赏!

注意:完全部署到 Glassfish 服务器工作(使用 appclient 和@EJB注入)

4

3 回答 3

6

经过大量搜索,找到了适合我的解决方案...

您必须使用属性配置 EJBContainer:EJBContainer.MODULES,以及模块类所在的位置(如果使用 maven,则为“target/classes”)。

例如

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

如果您的 EJB 使用 JPA,则另一个问题是您将无法在嵌入式容器中定义数据源,因此必须使用默认 ds:'jdbc/__default'。

所以例如我的 persistence.xml 看起来像这样:

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

我还没有弄清楚如何将嵌入式容器测试配置为使用一个 DS(jdbc/__default),而我的应用程序使用另一个(例如 jdbc/booksDS)

http ://www.mentby.com/glassfish/embedded-testing-woes.html

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

老实说,当像 spring 这样的解决方案如此简单时,我不知道为什么人们会为 Java EE 烦恼......

这非常令人沮丧并且浪费了很多时间......希望这会有所帮助。

于 2010-10-15T05:04:05.323 回答
3

您需要检查一些项目,以确保您可以通过context.lookup加载 bean,避免出现NamingException

  1. 确保你有一颗豆子。这听起来很明显,但我花了很多时间试图弄清楚为什么我无法在测试中获得我的服务实例。原因是我错过了无状态注释。

  2. 正如@Dzhu 指出的那样,在创建容器时添加模块。对于 maven将是target/ classes,对于 maven测试将是target/ test-classes

  3. 如果您SEVERE: EJB6005:No EJB modules found在控制台中找到类似的消息,则会出现问题。它告诉你没有无状态注释类

  4. Take a look at the embedded glassfish console! In there you will see the lookup names for your beans. Pay attention to the messages in the format INFO: EJB5181:Portable JNDI names for EJB YourBean: [java:global/classes/YourBean!bean.package.YourBean, java:global/classes/YourBean]. That means you can lookup your bean either by calling context.lookup("java:global/classes/YourBean!bean.package.YourBean") or by the shorter name context.lookup("java:global/classes/YourBean") which can be useful if there's no name collisions.

Hope this helps someone. It would have been really helpful to have had this tips.

于 2013-11-26T17:17:19.420 回答
2

我写了一个关于使用嵌入式 glassfish 3.1 容器的小教程,还解决了需要不同的 persistence.xml 进行测试的问题。还使用远程接口和 Web 服务修复容器崩溃。您可以在http://pschyska.blogspot.com/2011/06/unit-testing-ejb-31-with-netbeans-maven.html查看

于 2011-06-05T11:53:11.677 回答