2010-10-14 87 views
4

此问题是关于Java EE 6,使用glassfish v3 embedded-allJava EE 6 - 嵌入式容器EJB测试

我有一个使用的EJBContainer来测试我的无状态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资源路径:

例如问题是我使用JNDI有抬头的EJB(远程)麻烦

java:global/BookServiceEJB 

java:global/BookService 

连:

java:global/BookShelf-1.0-SNAPSHOT/BookServiceEJB 

等等

空话工作

没有任何XML部署配置文件,只有persistence.xml在META-INF。

测试是万无一失的使用maven:

mvn clean test 

任何帮助,不胜感激!

注意:全部署到GlassFish服务器的作品(使用appclient和@EJB注射)

+0

注意:对Glassfish服务器的全面部署工作(使用appclient和@EJB注入) – Dzhu 2010-10-14 23:26:36

回答

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/__默认”。

因此,例如,我的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/__默认设置),我的应用程序使用另一个(例如JDBC/booksDS)

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

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

说实话,我不知道为什么人们都与Java EE困扰时,像春天的解决方案是如此简单得多......

它一直非常令人沮丧,浪费了很多时间......希望这会有所帮助。

+0

此外,JNDI名称格式为:'java:global/classes/EJBClass!com.fully.qualified.remote。 EJBRemoteInterface' - 即jndi字符串中没有应用程序/模块组件。 – Dzhu 2010-10-16 01:56:46

+0

在persistence.xml中定义jta-data-source后,我也收到错误... 内部异常:java.sql.SQLException:分配连接时出错。原因:无法分配连接,因为:java.net.ConnectException:连接到端口1527上的服务器本地主机时出现Connection refused:连接错误。 错误代码:0 \t at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:309) – 2011-01-24 10:50:45

3

检查出来有需要,以确保您可以通过context.lookup避免的NamingException载入bean来检查的几个项目。

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

  2. 当@Dzhu指出创建容器时添加模块。对于行家目标/ ,对于行家测试目标/ 测试类

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

  4. 看看嵌入式glassfish控制台!在那里你会看到你的bean的查找名称。请注意格式为INFO: EJB5181:Portable JNDI names for EJB YourBean: [java:global/classes/YourBean!bean.package.YourBean, java:global/classes/YourBean]的消息。这意味着您可以通过调用context.lookup("java:global/classes/YourBean!bean.package.YourBean")或更短的名称context.lookup("java:global/classes/YourBean")来查找您的bean,如果没有名称冲突,这可能很有用。

希望这可以帮助别人。有这个提示会很有帮助。