Java Wildfly@Remote interface JNDI查找在同一服务器中的两个EAR之间

Java Wildfly@Remote interface JNDI查找在同一服务器中的两个EAR之间,java,jboss,ejb,wildfly,java-ee-6,Java,Jboss,Ejb,Wildfly,Java Ee 6,我正在将JavaEE6应用程序从glassfish 3.1.1.2迁移到WildFly 18 服务器上部署了两个EAR: + CoreEar + CoreEjb.jar + AppEar + AppEjb.jar + somewar1.war + somewar2.war 在CoreEJB中,我有一个远程接口: @Remote public interface ExampleInterface { // methods } 和实现bean: @Stat

我正在将JavaEE6应用程序从glassfish 3.1.1.2迁移到WildFly 18

服务器上部署了两个EAR:

+ CoreEar
    + CoreEjb.jar
+ AppEar
    + AppEjb.jar
    + somewar1.war
    + somewar2.war
在CoreEJB中,我有一个远程接口:

@Remote
public interface ExampleInterface {
    // methods
}
和实现bean:

@Stateless
@LocalBean
public class Example implements ExampleInterface {
    // methods implementation
}
在AppEjb中使用:

public class SomeManager {
    @EJB
    ExampleInterface injectedBean;
}
这段代码在glassfish上部署并运行良好。但它在WildFly 18上不起作用

CoreEar部署得很好,我可以在日志中找到关于名为“Example”的会话bean的JNDI绑定的信息:

[org.jboss.as.ejb3.deployment] (MSC service thread 1-2) WFLYEJB0473: JNDI bindings for session bean named 'Example' in deployment unit 'subdeployment "CoreEjb.jar" of deployment "CoreEar.ear"' are as follows:
    java:global/CoreEar/CoreEjb/Example!com.company.example.ExampleInterface
    java:app/CoreEjb/Example!com.company.core.ExampleInterface
    java:module/Example!com.company.core.ExampleInterface
    java:jboss/exported/CoreEar/CoreEjb/Example!com.company.core.ExampleInterface
    ejb:CoreEar/CoreEjb/Example!com.company.core.ExampleInterface
    java:global/CoreEar/CoreEjb/Example!com.company.core.Example
    java:app/CoreEjb/Example!com.company.core.Example
    java:module/Example!com.company.core.Example
    ejb:CoreEar/CoreEjb/Example!com.company.core.Example
但当我出现部署时,会出现异常:

13:45:38,344 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-8) MSC000001: Failed to start service jboss.deployment.subunit."AppEar.ear"."AppEjb.jar".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.subunit."AppEar.ear"."AppEjb.jar".INSTALL: WFLYSRV0153: Failed to process phase INSTALL of subdeployment "AppEjb.jar" of deployment "AppEar.ear"
        at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:183)
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1739)
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1701)
        at org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1559)
        at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
        at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1363)
        at java.lang.Thread.run(Thread.java:748)
    Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEE0052: Failed to install component SomeManager
        at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.deploy(ComponentInstallProcessor.java:109)
        at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:176)
        ... 8 more
    Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEJB0406: No EJB found with interface of type 'com.company.core.ExampleInterface' for binding com.company.managers.SomeManager/injectedBean
        at org.jboss.as.ejb3.deployment.processors.EjbInjectionSource.getResourceValue(EjbInjectionSource.java:90)
        at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.processBindings(ComponentInstallProcessor.java:261)
        at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.access$000(ComponentInstallProcessor.java:80)
        at org.jboss.as.ee.component.deployers.ComponentInstallProcessor$1.handle(ComponentInstallProcessor.java:213)
        at org.jboss.as.ee.component.ClassDescriptionTraversal.run(ClassDescriptionTraversal.java:54)
        at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.deployComponent(ComponentInstallProcessor.java:216)
        at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.deploy(ComponentInstallProcessor.java:101)
        ... 9 more
当我向@EJB注释添加查找字符串时,我能够解决这个异常

@EJB(lookup = "java:app/CoreEjbs/Example!com.company.core.ExampleInterface")
ExampleInterface injectedBean;
我不知道它是否会部署,因为在coreejb中查找其他接口时存在异常

问题是ExampleInterface被注入到更多的bean中,CoreEJB中除了ExampleInterface之外还有其他接口也被注入到许多bean中

在注入远程@EJB的每个地方声明查找都是一项艰巨的工作,并且会使以后很难更改实现等

有没有办法为每个@EJBExampleInterface事件全局声明JNDI查找名称


我曾经尝试过ejb-jar.xml和jboss-ejb3.xml,但都没有成功。

我们通过创建producer来解决这个问题,然后只进行简单的注入。允许将jndi路径放置在一个位置

@Remote
public interface ExampleRemote extends Example {
}

public class ExampleProducer {
    @Produces
    @EJB(lookup = "java:global/example/ejb/ExampleEJB!com.example.ExampleRemote")
    private static ExampleRemote exampleRemote;

}

@Inject
private Example example;

问题是您部署了两个EAR,它们的部署顺序是不确定的。当您的应用程序请求依赖项ejb时,它可能尚未部署,因此失败

您可以通过
jboss all.xml
要求先部署一些应用程序,然后再部署其他应用程序。例如,将下面的
jboss all.xml
打包为:


您是否找到了令人满意的解决方案?我遇到了同样的问题,我所看到的答案都不起作用。