Geronimo 3: поиск EJB приводит к NamingException

Я только что создал простой проект корпоративного приложения в Eclipse с веб-модулем и модулем EJB3.

Это мой EJB:

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

Это мой удаленный бизнес-интерфейс:

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

Это мой сервлет:

@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 для сопоставления имен с ресурсами и на этой странице вы можете прочитать это

Имя 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>

как создано мастером.


person Luigi Cortese    schedule 16.02.2016    source источник
comment
вы можете удалить содержимое вашего jndi context Context.list (); это зарегистрирует первый уровень дерева, от которого вы можете начать углубляться   -  person achabahe    schedule 17.02.2016


Ответы (1)


Как пользователь achabahe предложил, и с помощью этих вопросов / ответы, я распечатал все свое дерево 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"); 

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

person Luigi Cortese    schedule 16.02.2016