我想在不知道其实现的任何细节的情况下查找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,所以你不需要知道任何实现感觉它应该是基本情况。
答案 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中工作。