Tomcat 8 - LDAP: код ошибки NameNotFoundException 32, оставшееся имя пустая строка

Попытка перенести приложение из WebLogic12.2.1 Tomcat8.5.4что под Weblogic было записано какИностранные провайдеры JNDI для соединения LDAP был перенесен на новыйResource под Tomcat.

Следующийэтот совет на переполнение стека, обычайLdapContextFactory был упакован как новыйjar файл под Tomcatlib папка.

В котеserver.xml подать следующееGlobalNamingResources/Resource был настроен:

    <Resource name="ldapConnection" 
        auth="Container"
        type="javax.naming.ldap.LdapContext"
        factory="com.sample.custom.LdapContextFactory"
        singleton="false"
        java.naming.referral="follow"
        java.naming.factory.initial="com.sun.jndi.ldap.LdapCtxFactory"
        java.naming.provider.url="ldap://some.host:389"
        java.naming.security.authentication="simple"
        java.naming.security.principal="CN=some,OU=some,OU=some,DC=some,DC=a,DC=b"
        java.naming.security.credentials="password"
        com.sun.jndi.ldap.connect.pool="true"
        com.sun.jndi.ldap.connect.pool.maxsize="10"
        com.sun.jndi.ldap.connect.pool.prefsize="4"
        com.sun.jndi.ldap.connect.pool.timeout="30000" />

Приведенное выше соединение работает нормально при просмотре каталога LDAP через браузер LDAP, такой как Apache Directory Studio / LDAP Browser, встроенный в Eclipse.

Обычайcom.sample.custom.LdapContextFactory это довольно просто:

public class LdapContextFactory implements ObjectFactory {

    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment)
            throws Exception {

        Hashtable<Object, Object> env = new Hashtable<>();
        Reference reference = (Reference) obj;
        Enumeration<RefAddr> references = reference.getAll();

        while (references.hasMoreElements()) {
            RefAddr address = references.nextElement();
            String type = address.getType();
            String content = (String) address.getContent();
            env.put(type, content);
        }
        return new InitialLdapContext(env, null);
    }
}

Однако при запуске Tomcat выдает следующее исключение:

07-Sep-2016 15:04:01.064 SEVERE [main] org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans Exception processing Global JNDI Resources
 javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-031001E5, problem 2001 (NO_OBJECT), data 0, best match of:
    ''
 ]; remaining name ''
    at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3160)
    at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3081)
    at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2888)
    at com.sun.jndi.ldap.LdapCtx.c_listBindings(LdapCtx.java:1189)
    at com.sun.jndi.toolkit.ctx.ComponentContext.p_listBindings(ComponentContext.java:592)
    at com.sun.jndi.toolkit.ctx.PartialCompositeContext.listBindings(PartialCompositeContext.java:330)
    at com.sun.jndi.toolkit.ctx.PartialCompositeContext.listBindings(PartialCompositeContext.java:317)
    at javax.naming.InitialContext.listBindings(InitialContext.java:472)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:136)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:145)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:110)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.lifecycleEvent(GlobalResourcesLifecycleListener.java:82)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94)
    at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:401)
    at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:345)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:784)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:655)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:355)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495)

Аналогичный вопросы и исследования предполагают недопустимый DN LDAP, но:

Та же самая конфигурация LDAP работает отлично через Клиент LDAPПоиск не выполняется, во время запуска Tomcat выдает это исключение без запросаОшибка предполагает пустую строку'' какremaining nameследовательно не особо чего-то не нашел, видимо

Вопросы): Это правильный способ перенестиИностранные провайдеры JNDI вход из WebLogic в Tomcat? Как исправить неверную запись LDAP DN с пустым оставшимся именем? Может ли это быть пропущеннымbaseDN настроить где-нибудь?

Обновить
Та же самая ошибка происходит при измененииLdapContextFactory на следующее, как это предлагается в комментариях:

public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment)
        throws Exception {

    Hashtable<Object, Object> env = new Hashtable<>();
    Reference reference = (Reference) obj;
    Enumeration<RefAddr> references = reference.getAll();

    String providerUrl = "no valid URL";

    while (references.hasMoreElements()) {
        RefAddr address = references.nextElement();
        String type = address.getType();
        String content = (String) address.getContent();

        switch (type) {
        case Context.PROVIDER_URL:
            env.put(Context.PROVIDER_URL, content);
            providerUrl = content;
            break;

        default:
            env.put(type, content);
            break;
        }
    }

    InitialLdapContext context = null;
    Object result = null;
    try {
        context = new InitialLdapContext(env, null);

        LOGGER.info("looking up for " + providerUrl);
        result = context.lookup(providerUrl);
    } finally {
        if (context != null) {
            context.close();
        }
    }
    LOGGER.info("Created new LDAP Context");
    return result;
}

Изменение подтверждается путем регистрации, чтобы убедиться, что оно было правильно развернуто.

Вовлеченный слушатель по умолчанию определяется в верхней частиserver.xml подать как

<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

И не может быть отключен согласноофициальная документация:

Слушатель жизненного цикла глобальных ресурсов инициализирует глобальные ресурсы JNDI, определенные вserver.xml как часть элемента глобальных ресурсов. Без этого слушателя ни один из глобальных ресурсов не будет доступен.

То же самое происходит и в версии Tomcat8.5.5 а также7.0.69: просто добавив новый глобальный ресурс, как указано выше, и дополнительный jar, предоставляющий фабрику выше, будет сгенерировано исключение, указывающее на оставшееся пустое имя.

Ответы на вопрос(1)

Ваш ответ на вопрос