我遇到了一个大问题,我解决不了。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
更新:我发现了第一个错误,在配置一个错字(JDNI VS JNDI),但有一个另外一个问题: 警告:RAR8035:异常而创建的JDBC连接池[书架]:,COM .sun.appserv.connectors.internal.api.ConnectorRuntimeException:无法找到模块的位置:__ds_jdbc_ra – 2012-03-17 09:02:08
嘿,我也在为这个错误奋斗,无法找到模块的位置... 事情是一个错误的文件夹放置在测试文件夹中的玻璃鱼结构。 我_src /测试/ GlassFish的/ lib目录/应用/ __ ds_jdbc_ra_。我错过下_lib_的_install_文件夹,所以正确的结构是_src /测试/ GlassFish的/ lib目录/安装/应用/ __ ds_jdbc_ra_上解决了这个问题对我来说。 – 2013-11-15 13:38:23
当我有时间时,我会试一试。谢谢你的提示。 – 2014-01-17 10:57:29