在不了解实现的情况下查找JavaEE Bean

时间:2017-07-19 18:54:55

标签: java wildfly javabeans

我想在不知道其实现的任何细节的情况下查找JavaEE bean,这样我就可以换掉bean的实现,而不需要编辑我想要交换的bean之外的任何东西。它在我看来就像那里没有办法做到这一点,但这对我来说似乎很奇怪。有没有办法做到这一点,如果有,怎么做?

我认为会起作用:

这些都部署到一个Wildfly实例,所有战争都取决于jar。

罐:

@Remote
public interface MyLovelyInterface{
    public int doLovelyThings(int a);
}

@Remote
public interface MyEvilInterface{
    public int doEvilThings(int a);
}

WAR1:

@Singleton
public Class LovelyBean implements MyLovelyInterface{
    ....//Implementation
}

WAR2:

@Singleton
public Class EvilBean implements MyEvilInterface{
    @EJB
    MyLovelyInterface myLovelyInterface;
    ....//Implementation
}

因为我问这个问题显然不起作用。在部署时,我得到以下异常:

[INFO] [talledLocalContainer] Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEJB0406: No EJB found with interface of type 'com.mybiz.MyLovelyInterface' for binding com.mybiz.EvilBean/myLovelyInterface

我尝试添加几种注释组合,比如命名bean和指定查找,命名bean并按名称查找bean,并将实现指定为远程bean,但它们都提供了相同的功能。错误。我怀疑我错过了一些重要的东西,因为通过它的界面查找bean,所以你不需要知道任何实现感觉它应该是基本情况。

1 个答案:

答案 0 :(得分:0)

我不相信可以在另一个WAR中访问一个WAR中的类。 Classloading in WildFly文档清楚地表明了EAR文件:

  

ear-subdeployments-isolated元素值对.war文件的隔离类加载器没有影响。即,无论此标志是设置为true还是false,.ear中的.war都将有一个隔离的类加载器,其中的.ear中的其他子部署将无法访问该.war的类。这是按照规范。

我认为这也适用于隔离部署。这不适用于JAR文件。

您需要执行完整的远程EJB查找(根据Remote EJB invocations via JNDI来完成您的要求。但您需要注意,此功能可能会从一个WildFly版本消失到另一个版本,因为WAR文件之间的RMI是Java EE规范没有强制要求。它恰好在WildFly中工作。