我有下一个设置:
部署在 glassfish 3.2.1 应用服务器中的 EJB。
尝试将 Springboot 应用程序部署为 Wildfly 11 应用程序服务器上的 WAR。
在我的 springboot 应用程序中,我为 glassfish 客户端(gf-client)添加了 maven 依赖项:
<dependency>
<groupId>org.glassfish.main.appclient</groupId>
<artifactId>gf-client</artifactId>
<version>5.1.0</version>
</dependency>
当我尝试在 wildfly 中部署 springboot 应用程序时,服务器会在日志中写入以下消息:
[org.jboss.as.ejb3.deployment](MSC 服务线程 1-7)WFLYEJB0473:部署单元“部署“gestion-garantias-fcd.war”中名为“TimerBean”的会话 bean 的 JNDI 绑定如下:
java:global/gestion-garantias-fcd/TimerBean!org.glassfish.ejb.persistent.timer.TimerLocal java:app/gestion-garantias-fcd/TimerBean!org.glassfish.ejb.persistent.timer.TimerLocal java:module/ TimerBean!org.glassfish.ejb.persistent.timer.TimerLocal java:global/gestion-garantias-fcd/TimerBean java:app/gestion-garantias-fcd/TimerBean java:module/TimerBean
10:31:38,790 错误 [org.jboss.msc.service.fail](MSC 服务线程 1-6)MSC000001:无法启动服务 jboss.deployment.unit。“gestion-garantias-fcd.war”。安装:org .jboss.msc.service.StartException in service jboss.deployment.unit."gestion-garantias-fcd.war".INSTALL: WFLYSRV0153: 无法在 org.jboss 处理部署“gestion-garantias-fcd.war”的阶段安装.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:172) 在 org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:2032) 在 org.jboss.msc.service.ServiceControllerImpl$StartTask .run(ServiceControllerImpl.java:1955) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker。在 java.lang.Thread.run(Thread.java:748) 处运行(ThreadPoolExecutor.java:624)
引起:org.jboss.as.server.deployment.DeploymentUnitProcessingException:WFLYEE0041:组件类 org.glassfish.ejb.persistent.timer.TimerBean 的组件 TimerBean 有错误:WFLYJPA0033:在部署中找不到名为 __EJB__Timer__App 的持久性单元gestion-garantias-fcd.war" 在 org.jboss.as.ee.component.ClassDescriptionTraversal.run(ClassDescriptionTraversal.java:54) 的 org.jboss.as.ee.component.ClassDescriptionTraversal.run(ClassDescriptionTraversal.java:54) 的 org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor$1.handle(ModuleJndiBindingProcessor.java:157)。 as.ee.component.deployers.ModuleJndiBindingProcessor.processClassConfigurations(ModuleJndiBindingProcessor.java:186) 在 org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor.deploy(ModuleJndiBindingProcessor.java:143) 在 org.jboss.as.server。 deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:165) ... 5 更多
10:31:38,797 错误 [org.jboss.as.controller.management-operation](控制器引导线程)WFLYCTL0013:操作(“部署”)失败 - 地址:([(“部署”=>“gestion-garantias-fcd .war")]) - 失败描述:{ "WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"gestion-garantias-fcd.war\".INSTALL" => "WFLYSRV0153: 无法处理阶段部署安装“gestion-garantias-fcd.war” 原因:org.jboss.as.server.deployment.DeploymentUnitProcessingException:WFLYEE0041:组件类 org.glassfish.ejb.persistent.timer.TimerBean 的组件 TimerBean 有错误: WFLYJPA0033:在部署 \"gestion-garantias-fcd.war\""} 中找不到名为 __EJB__Timer__App 的持久性单元,"WFLYCTL0412:未安装的必需服务:" => ["jboss.deployment.unit.\"gestion-garantias-fcd.war\".beanmanager"], "WFLYCTL0180: 缺少/不可用依赖项的服务" => ["jboss. deployment.unit.\"gestion-garantias-fcd.war\".weld.weldClassIntrospector 丢失 [jboss.deployment.unit.\"gestion-garantias-fcd.war\".beanmanager]", "jboss.deployment.unit .\"gestion-garantias-fcd.war\".batch.artifact.factory 丢失 [jboss.deployment.unit.\"gestion-garantias-fcd.war\".beanmanager]" ] }[ "jboss.deployment.unit.\"gestion-garantias-fcd.war\".weld.weldClassIntrospector 丢失 [jboss.deployment.unit.\"gestion-garantias-fcd.war\".beanmanager]", "jboss .deployment.unit.\"gestion-garantias-fcd.war\".batch.artifact.factory 丢失 [jboss.deployment.unit.\"gestion-garantias-fcd.war\".beanmanager]" ] }[ "jboss.deployment.unit.\"gestion-garantias-fcd.war\".weld.weldClassIntrospector 丢失 [jboss.deployment.unit.\"gestion-garantias-fcd.war\".beanmanager]", "jboss .deployment.unit.\"gestion-garantias-fcd.war\".batch.artifact.factory 丢失 [jboss.deployment.unit.\"gestion-garantias-fcd.war\".beanmanager]" ] }
我加粗了我认为是错误的主要原因。
基本上,错误的发生是因为 gf-client 中存在一个名为 ejb-timer-service-app 的内部应用程序,并且它包含一个持久性配置 (persistence.xml)。该配置指定了一个名为__EJB__Timer__App的持久性单元,它引用通常在所有 glassfish 安装 (jdbc/__TimerPool) 中创建的数据源。
我不知道那个应用程序(ejb-timer-service-app)在 gf-client 中的位置,但我试图排除 gf-client 依赖项。确切地说,我试图排除下一个依赖项:
<groupId>org.glassfish.main.ejb</groupId>
<artifactId>ejb</artifactId>
但错误仍然存在。
然后,我选择在 gf-client 中使用一些单独的嵌入依赖项。依赖项列表在这里:
<dependency>
<groupId>org.glassfish.main.deployment</groupId>
<artifactId>deployment-client</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.main.common</groupId>
<artifactId>glassfish-naming</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.reactivestreams</groupId>
<artifactId>reactive-streams</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.main.ejb</groupId>
<artifactId>ejb-client</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.main.orb</groupId>
<artifactId>orb-connector</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.main.ejb</groupId>
<artifactId>ejb-container</artifactId>
<version>5.0</version>
</dependency>
第一个错误(找不到持久性单元..)消失了。但是现在,又发现了一个错误:
原因:javax.naming.NamingException:在 SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3701] 中查找 'java:global/gyf_electronicdocument_guaranteeCrediro_ear/gyf_electronicdocument_guaranteeCredioro_business/GuaranteeCOBean!com.gyf.electronicdocument.guaranteeCredioro.to.GuaranteeRemote' 失败, java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory, java.naming.ldap.version=3, org.omg.CORBA.ORBInitialHost=127.0.0.1, java.naming.factory.state=com .sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [根异常是 javax.naming.NamingException:无法获取 SerialContextProvider 的 SerialContext [ myEnv={org.omg.CORBA.ORBInitialPort=3701,java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory,java.naming.ldap。版本=3,org.omg.CORBA.ORBInitialHost=127.0.0.1,java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl,java.naming.factory.url.pkgs= com.sun.enterprise.naming} [根异常是 java.lang.RuntimeException:Orb 初始化错误]] 在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:467) 在 com.sun.enterprise .naming.impl.SerialContext.lookup(SerialContext.java:414) 在 javax.naming.InitialContext.lookup(InitialContext.java:417) 在 javax.naming.InitialContext.lookup(InitialContext.java:417) 在 javax.naming。 InitialContext.lookup(InitialContext.java:417) 位于 com.gyf.gestiongarantias.config.DocumentoElectronicoEJBConfig.ejbWarranty(DocumentoElectronicoEJBConfig.java:40) 位于 com.gyf.gestiongarantias.config。DocumentoElectronicoEJBConfig$$EnhancerBySpringCGLIB$$e5ce1c3b.CGLIB$ejbWarranty$1() at com.gyf.gestiongarantias.config.DocumentoElectronicoEJBConfig$$EnhancerBySpringCGLIB$$e5ce1c3b$$FastClassBySpringCGLIB$$b2972094.invoke() at org.springoxyframework.cglib。 .invokeSuper(MethodProxy.java:244) at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) at com.gyf.gestiongarantias.config.DocumentoElectronicoEJBConfig$$EnhancerBySpringCGLIB$$e5ce1c3b.ejbWarranty()在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect。Method.invoke(Method.java:498) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ... 92 更多
原因:javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3701, java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory, java.naming .ldap.version=3, org.omg.CORBA.ORBInitialHost=127.0.0.1, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url .pkgs=com.sun.enterprise.naming} [根异常是 java.lang.RuntimeException: Orb 初始化错误] at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:310) at com.sun .enterprise.naming.impl.SerialContext.lookup(SerialContext.java:453) ... 107 更多
引起:java.lang.RuntimeException:在 com.sun.enterprise.naming.impl.SerialContext.getORB(SerialContext. java:323) 在 com.sun.enterprise.naming.impl.SerialContext.getProviderCacheKey(SerialContext.java:330) 在 com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:360) 在 com.sun .enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:305) ... 108 更多原因:org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:139) 处的 java.lang.NullPointerException ) ... 112 更多
我尝试使用多个依赖项来减轻此错误,但我已经用尽了我的替代方案。
所以我的问题是:
我应该在我的 springboot 应用程序中配置一个持久性单元,其名称与 persistence.xml 中的名称相同吗?
我应该排除任何依赖项吗?
如果 gf-client 不是最好的方法,我应该为我的案例使用 glassfish 存储库的哪些依赖项?
在我的案例中暴露的这些条件下,还有其他方法可以调用远程 EJB 吗?
在此先感谢您,希望您一切顺利。