2012-03-17 66 views
3

我遇到了一个大问题,我解决不了。Glassfish的嵌入的JUnit测试EJB

我想用JavaEE6和EJB编写一个小应用程序。我想用EJBContainer和Glassfish Embedded建立测试环境。

该项目是通过Maven创建的,但EJBContainer由测试类本身启动,因为我发现它比从maven启动更容易和更普遍。

我创建了一个基于我的src/test/glassfish-domain文件夹中的一些文章的GlassFish域(在正确的结构中,见下文)。

如果我的domains.xml中没有包含我的JDBC资源,我定义测试我的应用程序,GF嵌入启动正确。但是当我定义所需的JDBC资源时,我得到了一个没有解释的NullPointerException。

任何人都可以指出我,我做错了什么?

域配置片段:

<resources> 
    <!-- [...] --> 
    <jdbc-resource pool-name="bookshelf" jdni-name="jdbc/bookshelf" /> 
    <jdbc-connection-pool driver-classname="" datasource-classname="org.apache.derby.jdbc.ClientDataSource" res-type="javax.sql.DataSource" description="" name="bookshelf"> 
     <property name="User" value="APP"></property> 
     <property name="DatabaseName" value="bookshelf-db"></property> 
     <property name="RetrieveMessageText" value="true"></property> 
     <property name="Password" value="APP"></property> 
     <property name="ServerName" value="localhost"></property> 
     <property name="Ssl" value="off"></property> 
     <property name="SecurityMechanism" value="4"></property> 
     <property name="ConnectionAttributes" value=";create=true"></property> 
     <property name="TraceFileAppend" value="false"></property> 
     <property name="TraceLevel" value="-1"></property> 
     <property name="PortNumber" value="1527"></property> 
     <property name="LoginTimeout" value="0"></property> 
    </jdbc-connection-pool> 
    </resources> 
    <servers> 
    <server name="server" config-ref="server-config"> 
     <!-- [...] --> 
     <resource-ref ref="jdbc/bookshelf" /> 
    </server> 

日志:

javax.ejb.EJBException: java.lang.NullPointerException 
    at org.glassfish.ejb.embedded.EJBContainerProviderImpl.createContainer(EJBContainerProviderImpl.java:233) 
    at org.glassfish.ejb.embedded.EJBContainerProviderImpl.createEJBContainer(EJBContainerProviderImpl.java:129) 
    at javax.ejb.embeddable.EJBContainer.createEJBContainer(EJBContainer.java:127) 
    at me.hron.bookshelf.test.ejb.CategoryFacadeTest.setupContainer(CategoryFacadeTest.java:52) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110) 
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175) 
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68) 
Caused by: java.lang.NullPointerException 
    at com.sun.enterprise.config.serverbeans.Resources$Duck.getResourceByName(Resources.java:172) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.jvnet.hk2.config.Dom.invokeDuckMethod(Dom.java:946) 
    at org.jvnet.hk2.config.Dom.invoke(Dom.java:899) 
    at org.glassfish.config.support.TranslatedConfigView.invoke(TranslatedConfigView.java:119) 
    at $Proxy58.getResourceByName(Unknown Source) 
    at org.glassfish.javaee.services.ResourceManager.isBindableResourceEnabled(ResourceManager.java:188) 
    at org.glassfish.javaee.services.ResourceManager.deployResources(ResourceManager.java:162) 
    at org.glassfish.javaee.services.ResourceManager.postConstruct(ResourceManager.java:116) 
    at com.sun.hk2.component.AbstractCreatorImpl.inject(AbstractCreatorImpl.java:131) 
    at com.sun.hk2.component.ConstructorCreator.initialize(ConstructorCreator.java:91) 
    at com.sun.hk2.component.AbstractCreatorImpl.get(AbstractCreatorImpl.java:82) 
    at com.sun.hk2.component.SingletonInhabitant.get(SingletonInhabitant.java:67) 
    at com.sun.hk2.component.EventPublishingInhabitant.get(EventPublishingInhabitant.java:139) 
    at com.sun.hk2.component.AbstractInhabitantImpl.get(AbstractInhabitantImpl.java:76) 
    at com.sun.enterprise.v3.server.AppServerStartup.run(AppServerStartup.java:336) 
    at com.sun.enterprise.v3.server.AppServerStartup.doStart(AppServerStartup.java:145) 
    at com.sun.enterprise.v3.server.AppServerStartup.start(AppServerStartup.java:136) 
    at com.sun.enterprise.glassfish.bootstrap.GlassFishImpl.start(GlassFishImpl.java:79) 
    at org.glassfish.ejb.embedded.EJBContainerProviderImpl.createContainer(EJBContainerProviderImpl.java:203) 
... 25 more 
+0

更新:我发现了第一个错误,在配置一个错字(JDNI VS JNDI),但有一个另外一个问题: 警告:RAR8035:异常而创建的JDBC连接池[书架]:,COM .sun.appserv.connectors.internal.api.ConnectorRuntimeException:无法找到模块的位置:__ds_jdbc_ra – 2012-03-17 09:02:08

+1

嘿,我也在为这个错误奋斗,无法找到模块的位置... 事情是一个错误的文件夹放置在测试文件夹中的玻璃鱼结构。 我_src /测试/ GlassFish的/ lib目录/应用/ __ ds_jdbc_ra_。我错过下_lib_的_install_文件夹,所以正确的结构是_src /测试/ GlassFish的/ lib目录/安装/应用/ __ ds_jdbc_ra_上解决了这个问题对我来说。 – 2013-11-15 13:38:23

+0

当我有时间时,我会试一试。谢谢你的提示。 – 2014-01-17 10:57:29

回答

1

glassfish的文件夹必须具有一个lib

结构是这样的

lib 
+install 
++aplications 

具有

jaxr-ra 
jmsra 
__cp_jdbc_ra 
__dm_jdbc_ra 
__ds_jdbc_ra 
__xa_jdbc_ra 
+0

对不起,这是一个2岁的线程,我没有应用程序的来源了。这是一个游乐场项目,我在几个月前将其移植到我的新笔记本电脑时删除了它。无论如何,感谢您的回复。 – 2014-12-06 18:06:41

+0

我遇到了同样的问题,建议的解决方案适用于我。谢谢! – Bob 2016-11-17 12:26:38