2014-09-18 13 views
0

현재 WebSphere 서버에 배치하기위한 응용 프로그램을 개발 중입니다. 응용 프로그램은 원격 EJB로 구현 된 서비스에 대한 액세스를 제공하는 사내 서비스 공급자를 사용해야합니다. Service Provider Bean은 하드 코드 된 jndi 이름을 사용할 수 있습니다.WebSphere JNDI 조회를 허용하도록 Tomee 구성

개발 중에 Tomee를 사용하고 있으며 일반적으로 모두 잘 작동합니다. 한 가지를 제외한 모든 것 : ServiceProvider는 "cell/persistent/configService"의 jndi-lookup을 수행합니다. 이제 이러한 서비스를위한 모의 EJB가 포함 된 모의 귀 (mock ear)를 만들려고했습니다. 나는 그들을 배치 할 수 있고, 나는 "java : global/framework-mock-ear-1.0.0-SNAPSHOT/framework-mock-impl/ConfigServiceMock"과 같은 jndi-name을 사용하여 응용 프로그램에서 그것들에 접근 할 수있다. 의 JNDI 조회를 사용하여 액세스 할 수없는 것 같다 "셀/지속/configService은"... 지금은 들어 내 모의 구현에 OpenEJB를-jar.xml 파일을 추가 :

<openejb-jar> 
    <ejb-deployment ejb-name="ConfigServiceMock"> 
     <jndi name="cell/persistent/configService" 
       interface="de.thecompany.common.services.config.ConfigService"/> 
    </ejb-deployment> 
</openejb-jar> 

그리고 나는 볼 수 있습니다

INFORMATION: Jndi(name=cell/persistent/configService) --> Ejb(deployment-id=ConfigServiceMock) 

을하지만 어떻게 다른 귀는 그 이름을 사용하여이 빈에 액세스 할 수 있도록하는 지금 생각을 가지고 시작하는 동안, 그 빈은 그 이름에서 제대로 등록 할 것으로 보인다.

서비스 제공자 부품이 제공되며이를 변경할 수 없으므로 하드 코딩 된 jndi 이름을 변경하지 마십시오. 우리는 분명히 그렇게하고 싶지만 아무 것도 변경할 수는 없습니다.

+0

jndi 이름으로 {deploymentId}/{interfaceClassName}을 (를) 시도하고 bean을 찾을 수 있는지 확인하십시오. – Abhin

+0

예, 작동하지만 예를 들어 게시물에 글을 올렸을 때 이름을 변경할 수 없습니다. 내가 사용해야하는 컴파일 된 라이브러리. –

+0

나는 당신의 클라이언트/yourEB에서 그 이름을 사용해서 찾아보기를 의미했다. 조회를 어디에서하고 있습니까? – Abhin

답변

0

좋아 ... 나는 이것에 꽤 많은 시간을 낭비했다. 마침내 해결책이 생길 때까지. 콩을 찾기 위해 Tomee와 OpenEJB를 구성하는 대신 InitialContext를 납치하고 쿼리를 다시 작성했습니다. 내 MycompanyInitialContext의 문맥 구현 주입 할 수 있었다 시스템 프로퍼티

java.naming.factory.initial=de.mycompany.mock.tomee.MycompanyNamingContextFactory 

설정하여

package de.mycompany.mock.tomee; 

import org.apache.naming.java.javaURLContextFactory; 

import javax.naming.Context; 
import javax.naming.NamingException; 
import java.util.Hashtable; 

public class MycompanyNamingContextFactory extends javaURLContextFactory { 

    private static Context initialContext; 

    @Override 
    public Context getInitialContext(Hashtable environment) throws NamingException { 
     if(initialContext == null) { 
      Hashtable childEnv = (Hashtable) environment.clone(); 
      childEnv.put("java.naming.factory.initial", "org.apache.naming.java.javaURLContextFactory"); 
      initialContext = new MycompanyInitialContext(childEnv); 
     } 
     return initialContext; 
    } 

} 

:

package de.mycompany.mock.tomee; 

import org.apache.openejb.core.ivm.naming.IvmContext; 
import org.apache.openejb.core.ivm.naming.NameNode; 

import javax.naming.NamingException; 
import java.util.Hashtable; 

public class MycomanyInitialContext extends IvmContext { 

    public MycomanyInitialContext(Hashtable<String, Object> environment) throws NamingException { 
     super(environment); 
    } 

    @Override 
    public Object lookup(String compositName) throws NamingException { 
     if("cell/persistent/configService".equals(compositName)) { 
      return super.lookup("java:global/mycompany-mock-ear-1.0.0-SNAPSHOT/mycompany-mock-impl/ConfigServiceMock"); 
     } 
     if("cell/persistent/authorizationService".equals(compositName)) { 
      Object obj = super.lookup("java:global/mycompany-mock-ear-1.0.0-SNAPSHOT/mycompany-mock-impl/AuthServiceMock"); 
      return obj; 
     } 
     return super.lookup(compositName); 
    } 

} 

을 나는이 꽤하지 않고 알고 사람이 어떻게 아이디어가있는 경우 이것을 더 쉽고 더 예쁘게 만드십시오, 나는 모든 귀이고이 해결책은 효과가있는 것처럼 보입니다. 개발 과정에서 생산 서비스를 시뮬레이션하기위한 용도로만 사용 되었기 때문에이 해킹은 나에게 악몽을 불러 일으키지 않습니다. 그냥 다른 사람이 비슷한 걸 비틀 거리는 경우에 대비해 내가 게시 할 것이라고 생각했습니다.