2014-11-27 1 views
3

У меня есть требование, когда меня попросят загрузить как удаленные, так и локальные EJB с помощью JNDI-поиска, поэтому без аннотации @EJB.JNDI Поиск локального EJB (нет @ EJB)

Мой EJB определяется следующим образом:

@Remote 
public interface MyObjectInterfaceRemote extends MyObjectInterface { 

} 

@Local 
public interface MyObjectInterfaceLocal extends MyObjectInterface { 

} 

public interface MyObjectInterface { 
    // A bunch of methods which both remote and local ejbs will inherit 
} 

@Remote(MyObjectInterfaceRemote.class) 
@Local(MyObjectInterfaceLocal.class) 
public class MyObjectEJB implements MyObjectInterfaceLocal, MyObjectInterfaceRemote { 
    //implementation of all methods inherited from MyObjectInterface. 
} 

Я использую этот код для поиска удаленного EJB:

private MyObjectInterfaceRemote getEJB() throws NamingException { 
    InitialContext context = new InitialContext(); 
    return (MyObjectInterfaceRemote) context.lookup(MyObjectInterfaceRemote.class.getName()); 
} 

Он отлично работает, но если я сделаю еще один способ, как это:

private MyObjectInterfaceLocal getLocalEJB() throws NamingException { 
    InitialContext context = new InitialContext(); 
    return (MyObjectInterfaceLocal) context.lookup(MyObjectInterfaceLocal.class.getName()); 
} 

я

javax.naming.NameNotFoundException: 
Context: Backslash-PCNode03Cell/nodes/Backslash-PCNode03/servers/server1, 
name: MyObjectInterfaceLocal: First component in name MyObjectInterfaceLocal not found. 
[Root exception is org.omg.CosNaming.NamingContextPackage.NotFound: 
IDL:omg.org/CosNaming/NamingContext/NotFound:1.0] 
[...] 

Что мне не хватает? Должен ли я использовать что-то другое для поиска локального ejb?

Примечание: Если я использую

@EJB 
MyObjectInterfaceLocal ejb; 

Местные получает EJB успешно загружена.

+0

Да, для поиска локального интерфейса вам нужно прикрепить его к 'ejblocal:'. Проверьте здесь [Что такое имя JNDI по умолчанию для EJB в Websphere] (http://stackoverflow.com/a/24005631/3701228) и обратите внимание на префиксы ejblocal. Вы должны увидеть эти имена в журнале во время запуска приложения. – Gas

ответ

5

Вы пробовали код ниже?

context.lookup("ejblocal:"+MyObjectInterfaceLocal.class.getName()) 

Webshpere использует различные шаблоны привязки по умолчанию для удаленных и локальных интерфейсов.

+0

Большое вам спасибо! – BackSlash