Jakarta ee JavaEE6-嵌入式容器EJB测试
这个问题是关于JavaEE6,使用GlassFishV3嵌入所有 我有一个单元测试,它使用EJBContainer来测试我的无状态EJB。问题是我在使用JNDI查找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
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
SEVERE:EJB6005:No EJB modules found
的消息,则会出现问题。它告诉您不存在无状态注释类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>