2012-12-22 71 views
1

這是我第一次使用OpenEJB容器系統。當我使用InitialContext的lockup-Method時,我得到一個NameNotFoundException。我看過很多例子和教程,並在每個例子中,查找方法的樣子:OpenEJB 4.5.1:NameNotFoundException

initialContext.lookup("NameOfBean"); 

現在我發現它使用類似於下面的代碼片段這對我來說工作查找另一種解決方案。

initialContext.lookup("java:global/classpath.ear/ProjectName/NameofBean"); 

問題是爲什麼第一個版本不適合我和我做錯了什麼?

摘錄OpenEJB的日誌:

INFO - ******************************************************************************** 
INFO - OpenEJB http://openejb.apache.org/ 
INFO - Startup: Sat Dec 22 13:17:59 CET 2012 
INFO - Copyright 1999-2012 (C) Apache OpenEJB Project, All Rights Reserved. 
INFO - Version: 4.5.1 
INFO - Build date: 20121209 
INFO - Build time: 08:47 
INFO - ******************************************************************************** 
INFO - openejb.home = D:\workspace\ProjectName 
INFO - openejb.base = D:\workspace\ProjectName 
INFO - Succeeded in installing singleton service 
INFO - Cannot find the configuration file [conf/openejb.xml]. Will attempt to create one for the beans deployed. 
INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) 
INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) 
INFO - Using 'openejb.deployments.classpath.include=.*' 
INFO - Found EjbModule in classpath: D:\workspace\ProjectName\build\classes 
INFO - Searched 17 classpath urls in 2184 milliseconds. Average 128 milliseconds per url. 
INFO - Beginning load: D:\workspace\ProjectName\build\classes 
INFO - Configuring enterprise application: D:\workspace\ProjectName\classpath.ear 
WARNUNG - Method 'lookup' is not available for 'javax.annotation.Resource'. Probably using an older Runtime. 
INFO - Auto-deploying ejb NameOfBean: EjbDeployment(deployment-id=NameOfBean) 
[... AUTHORS'S NOTE: SOME MORE BEANS] 
INFO - Assembling app: D:\workspace\ProjectName\classpath.ear 
INFO - Hibernate Validator 4.2.0.Final 
INFO - Ignoring XML configuration. 
JAVA AGENT NOT INSTALLED. The JPA Persistence Provider requested installation of a ClassFileTransformer which requires a JavaAgent. See http://openejb.apache.org/3.0/javaagent.html 
INFO - OpenJPA dynamically loaded a validation provider. 
INFO - Jndi(name=NameOfBeanRemote) --> Ejb(deployment-id=NameofBean) 
INFO - Jndi(name=global/classpath.ear/ProjectName/NameOfBean!de.mypath.stateless.NameOfBeanInterface) --> Ejb(deployment-id=NameofBean) 
INFO - Jndi(name=global/classpath.ear/ProjectName/NameofBean) --> Ejb(deployment-id=NameOfBean) 
[... AUTHORS'S NOTE: SOME FOR OTHER BEANS] 
INFO - OpenWebBeans Container is starting... 
INFO - Adding OpenWebBeansPlugin : [CdiPlugin] 
INFO - All injection points are validated successfully. 
INFO - OpenWebBeans Container has started, it took 250 ms. 
INFO - Created Ejb(deployment-id=NameOfBean, ejb-name=NameOfBean, container=Default Stateless Container) 
[... AUTHORS'S NOTE: SOME FOR OTHER BEANS] 
INFO - Quartz scheduler 'OpenEJB-TimerService-Scheduler' initialized from an externally provided properties instance. 
INFO - Quartz scheduler version: 2.1.6 
INFO - Scheduler OpenEJB-TimerService-Scheduler_$_OpenEJB started. 
INFO - Started Ejb(deployment-id=NameOfBean, ejb-name=NameOfBean, container=Default Stateless Container) 
[... AUTHORS'S NOTE: SOME FOR OTHER BEANS] 

這是我的TestClass:

public class NamerOfBeanOpenEJBTest { 

private static InitialContext initialContext; 

@BeforeClass 
public static void setUp() throws Exception { 
     Properties properties = new Properties(); 
     properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory"); 
     properties.setProperty("openejb.deployments.classpath.include", ".*"); 
       initialContext = new InitialContext(properties); 
} 
@Test 
public void testBean() throws NamingException{ 
    Object object = initialContext.lookup("java:global/classpath.ear/ProjectName/NameOfBean"); 
    assertNotNull(object); 
    assertTrue(object instanceof NameOfBean); 
} 

@AfterClass 
public static void afterClass() throws Exception { 
    if (initialContext != null) { 
     initialContext.close(); 
    }} 
} 

是否有人有竅門或解決方案給我嗎? 非常感謝。

編輯:

在JBoss應用服務器7.1的查找可以像這樣的例子地方:

new InitialContext().lookup("ejb:/ProjectName//NameOfBean!de." + "mypath.sessionbean.stateless.NameOfBeanInterface"); 

心不是說可以在OpenEJB的?我是否必須更改每個bean中的每個查找調用以使用OpenEJB進行本地測試?這不是真正有效和省時。

回答

0

問題解決了!

查找的結構是{deploymentId} {interfaceType.annotationName}。因此,在我的情況下,它必須是

initialContext.lookup("NameOfBeanLocal"); 

或 initialContext.lookup( 「NameOfBeanRemote」); 取決於接口的類型。

要得到這個問題與JBoss解決您可以從默認查找

new InitialContext().lookup("ejb:/ProjectName//NameOfBean!de." + "mypath.sessionbean.stateless.NameOfBeanInterface"); 

切換到一些更靈活的像Dependcy,查找或依賴注入和使用@EJB批註。這兩種方式都是JBoss和OpenEJB的支持。