2016-02-16 5 views
0

Я только что создал простой проект Enterprise Application Project в Eclipse с веб-модулем и модулем EJB3.Geronimo 3: поиск EJB в результате NamingException

Это мой EJB:

@Stateless 
public class MyBean implements MyBeanRemote { 
    public String getGreeting(){return "Hello World!";} 
} 

Это мой Дистанционное бизнес Интерфейс:

@Remote 
public interface MyBeanRemote { 
    String getGreeting(); 
} 

Это мой Servlet:

@WebServlet("/MyServlet") 
public class MyServlet extends HttpServlet { 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     MyBeanRemote myBean = null; 

     try { 
      myBean=(MyBeanRemote) new InitialContext().lookup("XXX");    //1 
     } catch (NamingException e) {e.printStackTrace();} 

     response.getWriter().append(myBean.getGreeting()); 
    } 
} 

Бин-инъекция работает как шарм, но я не могу успешно выполнить поиск JDNI: что должно быть вставлено в строку //1 вместо XXX? Я пробовал все возможные комбинации (ну, явно отсутствующую правильный ...)

Насколько я понимаю, Geronimo использует OpenEJB для отображения имени к ресурсам и at this page вы можете прочитать, что

имя JNDI по умолчанию в следующем формате: {deploymentId}{interfaceType.annotationName}

, так что я подумал, что это просто MyBeanRemote, но это не работает ... что мне не хватает? Я провел последние часы с безуспешными попытками и читал похожие ответы здесь на SO.

Это мой openejb.jar.xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<ejb:openejb-jar xmlns:app="http://geronimo.apache.org/xml/ns/j2ee/application-2.0" xmlns:bp="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:client="http://geronimo.apache.org/xml/ns/j2ee/application-client-2.0" xmlns:conn="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2" xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2" xmlns:ejb="http://openejb.apache.org/xml/ns/openejb-jar-2.2" xmlns:jaspi="http://geronimo.apache.org/xml/ns/geronimo-jaspi" xmlns:log="http://geronimo.apache.org/xml/ns/loginconfig-2.0" xmlns:name="http://geronimo.apache.org/xml/ns/naming-1.2" xmlns:pers="http://java.sun.com/xml/ns/persistence" xmlns:pkgen="http://openejb.apache.org/xml/ns/pkgen-2.1" xmlns:sec="http://geronimo.apache.org/xml/ns/security-2.0" xmlns:web="http://geronimo.apache.org/xml/ns/j2ee/web-2.0.1"> 
    <dep:environment> 
     <dep:moduleId> 
      <dep:groupId>default</dep:groupId> 
      <dep:artifactId>MyProjectEJB</dep:artifactId> 
      <dep:version>1.0</dep:version> 
      <dep:type>car</dep:type> 
     </dep:moduleId> 
    </dep:environment> 
</ejb:openejb-jar> 

, созданную мастером.

+1

вы можете использовать содержимое контекста jndi Context.list (""); это закрепит первый уровень дерева, с которого вы можете начать, идя дальше – achabahe

ответ

0

Как пользователь achabahesuggested, и с помощью этих question/answers, я напечатал все мое JNDI дерево:

String getJNDITree() { 
    Context context=null; 
    try { 
     context = new InitialContext(); 
    } catch (NamingException e1) {e1.printStackTrace();} 

    List<String>roots=Arrays.asList("java:comp","java:module","java:app","java:global"); 

    StringBuilder tree=new StringBuilder(); 
    for(String root:roots) 
     recursiveDeepVisit(context,root,"",tree); 

    return tree.toString()+"\n"; 
} 

void recursiveDeepVisit(Context context,String path,String prefix,StringBuilder tree){ 
    tree.append("\n"+prefix+path); 
    try { 
     NamingEnumeration<NameClassPair> list = context.list(path); 
     while (list.hasMore()) { 
      String innerPath = path+"/"+list.next().getName(); 
      recursiveDeepVisit(context, innerPath, " "+prefix,tree); 
     } 
    } catch (Exception e) {} 
} 

получаю этот выход

java: 
    java:app 
     java:app/env 
     java:app/MyProjectEJB 
      java:app/MyProjectEJB/MyBean!com.dev.bean.MyBeanRemote 
      java:app/MyProjectEJB/MyBean 
     java:app/AppName 
    java:comp 
     java:comp/UserTransaction 
     java:comp/HandleDelegate 
     java:comp/ValidatorFactory 
     java:comp/TransactionManager 
     java:comp/Bundle 
     java:comp/TransactionSynchronizationRegistry 
     java:comp/env 
     java:comp/ORB 
     java:comp/Validator 
     java:comp/BundleContext 
    java:TransactionManager 
    java:TransactionSynchronizationRegistry 
    java:module 
     java:module/ModuleName 
     java:module/env 
    java:global 
     java:global/MyProject 
      java:global/MyProject/MyProjectEJB 
       java:global/MyProject/MyProjectEJB/MyBean!com.dev.bean.MyBeanRemote 
       java:global/MyProject/MyProjectEJB/MyBean 
     java:global/geronimo-mejb-3.0.1 
      java:global/geronimo-mejb-3.0.1/MEJB 
      java:global/geronimo-mejb-3.0.1/ejb 
       java:global/geronimo-mejb-3.0.1/ejb/mgmt 
        java:global/geronimo-mejb-3.0.1/ejb/mgmt/MEJB 
        java:global/geronimo-mejb-3.0.1/ejb/mgmt/MEJB!javax.management.j2ee.ManagementHome 
      java:global/geronimo-mejb-3.0.1/MEJB!javax.management.j2ee.ManagementHome 
     java:global/env 

Оказывается, что

MyBeanRemote myBean=(MyBeanRemote) new InitialContext().lookup("java:app/MyProjectEJB/MyBean!com.dev.bean.MyBeanRemote"); 

- это решение, которое я искал.