2013-08-23 33 views
1

是否可以在不進行JNDI查找的情況下從同一個應用程序服務器中的另一個耳朵注入StatelessBean?作爲應用程序服務器,我們使用的是JBoss 7.2。JBoss7上的EAR之間的EJB注入

我有以下設置:

EAR1 
│ services1-0.1.jar 
│ web-0.1.war 
│ 
├───lib 
│  EAR2-SERVICES-api-0.1.jar 
│ 
└───META-INF 
     application.xml 
     beans.xml 


EAR2 
│ EAR2-SERVICES-impl-0.1.jar 
│ 
├───lib 
│  EAR2-SERVICES-api-0.1.jar 
│ 
└───META-INF 
     application.xml 
     beans.xml 

EAR2例如包含以下服務:

@Named 
@Stateless 
public class ServiceBean implements Service { } 

和接口:

@Remote 
interface Service { } 

從EAR1調用者應該只考慮API而不是實現。我該如何實現,這是保證。當我必須使用JNDI名稱時,我必須知道實現的位置。

對於注射服務成EAR1我試圖@Inject@EJB。但是,我總是得到Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Service] with qualifiers [@Default] at injection point [[field] @Inject package.ServiceBean.service]

的MANIFEST.MF有依賴關係deployment.EAR2.ear

+0

類加載程序隔離兩個耳朵,使它們不會看到對方。 –

回答

2

隨着應用服務器的類加載器隔離兩個應用程序,EAR1不能看到你的服務接口的實施爲什麼抱怨不滿意依賴。我建議你在EAR1中實現一個生產者方法,查找和ejb代理將調用EAR2中的遠程ejb。這個page描述瞭如何查找遠程ejb。生產者的方法應該是這樣的:

@Produces 
public Service produceService() { 
    Properties jndiProps = new Properties(); 
    jndiProps.put(Context.INITIAL_CONTEXT_FACTORY,"org.jboss.naming.remote.client.InitialContextFactory"); 
    jndiProps.put(Context.PROVIDER_URL,"remote://localhost:4447"); 
    // create a context passing these properties 
    Context ctx = new InitialContext(jndiProps); 
    // lookup 
    Service service = (Service) ctx.lookup("<jndi name of the ejb>"); 
    return service; 
} 

這將滿足CDI所抱怨的依賴關係。

+0

而不是生產者我可以使用@EJB(lookup = ),它工作正常,但我總是必須知道實現的位置。這是我很難過的。 Service的用戶只需要知道API並且不需要了解實現,那麼這將是一個很好的模式。 – markus

+1

您不能使用@EJB(lookup = ...),因爲您必須提供部署實施的遠程服務器的地址。服務的用戶必須知道實際服務的位置,因爲它可以讓我在任何地方不僅在同一臺服務器上。你可以使用某種外部配置,甚至是環境屬性來提供遠程實現的地址。 –