Jakarta ee JavaEE6-嵌入式容器EJB测试

Jakarta ee JavaEE6-嵌入式容器EJB测试,jakarta-ee,jndi,java-ee-6,glassfish-3,glassfish-embedded,Jakarta Ee,Jndi,Java Ee 6,Glassfish 3,Glassfish Embedded,这个问题是关于JavaEE6,使用GlassFishV3嵌入所有 我有一个单元测试,它使用EJBContainer来测试我的无状态EJB。问题是我在使用JNDI查找EJB(远程)时遇到问题: setup() { ctx = EJBContainer.createEJBContainer().getContext(); } ... test() { BookService bookService = (BookService)ctx.lookup("java:global/BookS

这个问题是关于JavaEE6,使用GlassFishV3嵌入所有

我有一个单元测试,它使用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资源路径:

e、 g

甚至:

等等

什么都不管用

我没有配置任何xml部署文件,只有META-INF中的
persistence.xml

测试使用maven surefire:

mvn clean test
非常感谢您的帮助


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

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

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

e、 g

如果您的EJB使用JPA,那么另一个问题是您将无法在嵌入式容器中定义数据源,因此必须使用默认的ds:'jdbc/u 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> 

org.eclipse.persistence.jpa.PersistenceProvider
com.blah.domain.Book
jdbc/_默认值
我还没有弄清楚如何将嵌入式容器测试配置为使用一个DS(jdbc/_默认),并将我的应用程序配置为使用另一个DS(例如jdbc/booksDS)

老实说,我不知道为什么人们在像spring这样的解决方案如此简单的情况下还要为JavaEE烦恼


这是非常令人沮丧和浪费了很多时间。。。希望这能有所帮助。

我已经编写了一个关于使用嵌入式glassfish 3.1容器的小教程,还解决了测试需要不同persistence.xml的问题。还使用远程接口和Web服务修复容器崩溃。您可以在

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

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

  • 正如@Dzhu指出的,在创建容器时添加模块。对于maven将成为目标类,对于maven测试将成为目标测试类

  • 如果您在控制台中发现类似于
    SEVERE:EJB6005:No EJB modules found
    的消息,则会出现问题。它告诉您不存在无状态注释类

  • 看看嵌入式glassfish控制台吧!在那里,您将看到bean的查找名称。请注意以下格式的消息:EJB5181:ejbyourbean的可移植JNDI名称:[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,如果没有名称冲突,这将非常有用


  • 希望这对别人有帮助。如果有了这些技巧,将会非常有帮助。

    注意:完全部署到Glassfish服务器是可行的(使用appclient和@EJB注入)。此外,JNDI名称的格式为:“java:global/classes/EJBClass!”!com.full.qualified.remote.EJBRemoteInterface'-即jndi字符串中没有应用程序/模块组件。在persistence.xml中定义jta数据源后,我还收到一个错误。。。内部异常:java.sql.SQLException:分配连接时出错。原因:无法分配连接,因为:java.net.ConnectException:连接到端口1527上的服务器本地主机时出错,消息“连接被拒绝:连接”。错误代码:0位于org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:309)我现在正在阅读同一章。我发现你的博客非常有用。非常感谢。
    mvn clean test
    
    ...
    props = new Properties();
    props.put(EJBContainer.MODULES, new File("target/classes"));
    ec = EJBContainer.createEJBContainer(props);
    ...
    
    <?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>