OpenLiberty NameNotFoundException: java:/comp/env

У меня правильно работает веб-приложение в Tomcat, которое я хочу запустить на новом сервере OpenLiberty, приложение запускается правильно внутри OpenLiberty, но в момент инициации подключения к базе данных выдает следующее исключение:

[Default Executor-thread-15] 2018-03-15 15:02:30 ERROR TomcatConnectionManager:41 - Loading jdbc/mysql/myaap failure
javax.naming.NameNotFoundException: java:/comp/env
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLName.<init>(JavaURLName.java:83)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLNameParser.parse(JavaURLNameParser.java:39)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLNameParser.parse(JavaURLNameParser.java:60)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext$NameUtil.<init>(JavaURLContext.java:474)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext.lookup(JavaURLContext.java:321)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext.lookup(JavaURLContext.java:370)
    at org.apache.aries.jndi.DelegateContext.lookup(DelegateContext.java:161)

Приведенное выше исключение выдается на этапе поиска:

Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");

Есть ли способ заставить его работать на OpenLiberty, делая меньше изменений?


person aleroot    schedule 15.03.2018    source источник


Ответы (2)


В OpenLiberty эквивалентный поиск будет выглядеть так:

    Context initContext = new InitialContext();
    Context envContext = (Context) initContext.lookup("java:comp/env");

Суть в том, что вам нужно использовать java:comp/... вместо java:/comp/...


Причина, по которой Tomcat отличается от Liberty, заключается в том, что Tomcat — это просто контейнер сервлетов, а Liberty соответствует полной спецификации Java EE.

Согласно разделу EE.5.2.2 Спецификация Java EE 7:

Среда именования компонента приложения состоит из четырех логических пространств имен, представляющих среды именования с различными областями. Четыре пространства имен:

  • java:comp — имена в этом пространстве имен относятся к компонентам (например, к корпоративным компонентам). За исключением компонентов в веб-модуле, каждый компонент получает свое собственное пространство имен java:comp, не используемое совместно с каким-либо другим компонентом. Компоненты в веб-модуле не имеют собственного частного пространства имен компонентов. См. примечание ниже.
  • java:module — имена в этом пространстве имен являются общими для всех компонентов в модуле (например, все корпоративные компоненты в одном модуле EJB или все компоненты в веб-модуле).
  • java:app — имена в этом пространстве имен являются общими для всех компонентов во всех модулях в одном приложении, где «одно приложение» означает одну единицу развертывания, такую ​​как один файл уха, один модуль, развернутый автономно, и т. д. Например, файл war и jar-файл EJB в одном и том же файле ear будут иметь доступ к ресурсам в пространстве имен java:app.
  • java:global — имена в этом пространстве имен являются общими для всех приложений, развернутых в экземпляре сервера приложений. Обратите внимание, что экземпляр сервера приложений может представлять собой отдельный сервер, кластер серверов, административный домен, содержащий множество серверов, или даже больше. Объем экземпляра сервера приложений зависит от продукта, но должна быть возможность развертывания нескольких приложений в одном экземпляре сервера приложений.
person Andy Guibert    schedule 15.03.2018
comment
Я изменил на: java:comp/, но по-прежнему получаю javax.naming.NameNotFoundException: java:comp/ - person aleroot; 15.03.2018
comment
Я только что попробовал initContext.lookup("java:comp/env");, и это сработало для меня. Кроме того, включена ли функция jndi-1.0 в файле server.xml? (или какая-то другая функция, которая привлекает jndi-1.0) - person Andy Guibert; 15.03.2018
comment
также, поиск java:comp/ не будет работать, но java:comp будет - person Andy Guibert; 15.03.2018

Была аналогичная проблема между WebSphere и Tomcat. Я разрабатываю и тестирую на сервере Tomcat и использую утилиты, которые я не могу изменить, которые обрабатывают соединение БД с нашей DB2. В WebSphere он использует постоянный набор «jdbc/COMPDB2» для извлечения источника данных, когда я настраиваю Tomcat, и мой файл Web.xml разрешается в «java:comp/env/jdbc/SFCCDB2».

Моя работа для локального рабочего пространства заключается в добавлении прослушивателя для копирования ресурса на уровень в InitialContext. Я не очень разбираюсь в серверной части, но пока это работает с TomEE 7.0.81.

        InitialContext ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/SFCCDB2");
        javax.naming.Context envCtx = (javax.naming.Context) ctx.lookup("java:comp/env");
        try{
            /*
            Added this because after redeploying code to the server it would error 
            connecting to the DB with an SQLException Datasource is closed
             */
            DataSource dataSource = (DataSource) ctx.lookup("jdbc/COMPDB2");
            ctx.destroySubcontext("jdbc");
        } catch (NamingException e){
            //Doesn't exist; safe to just add
        }
        ctx.createSubcontext("jdbc");
        ctx.bind("jdbc/COMPDB2", ds);
        ctx.close();
person Tri Dave    schedule 13.03.2020