ctx.lookup() возвращает null, если я расширяю класс источника данных

#java #jakarta-ee #tomcat #jndi #connection-pooling

#java #джакарта-ee #tomcat #jndi #объединение пулов соединений

Вопрос:

Для тестов я хочу вручную привязать источник данных к имени. Он работает с apache SharedPoolDataSource, но если я расширяю класс, ctx.lookup() возвращает null.

Это как-то связано с InstanceKeyObjectFactory.isCorrectClass(), возвращающим false .

Все, что я хотел, это войти Datasource.getConnection()

 package org.foo;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameAlreadyBoundException;
import javax.sql.DataSource;

import org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS;
import org.apache.commons.dbcp.datasources.SharedPoolDataSource;

public class TestFactory {

    private static final String JNDINAME = "stubJs";
    private static final String JDBCURL = "jdbc:db2://localhost:50000/dbname";

    public static void main(String[] args) throws Exception {
        String jndiName = JNDINAME;
        InitialContext ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup(jndiName);
        System.out.println(ds);
    }

    static {
        Context ictx;
        try {
            DriverAdapterCPDS cpds = new DriverAdapterCPDS();
            cpds.setDriver("com.ibm.db2.jcc.DB2Driver");
            cpds.setUrl(JDBCURL);
            cpds.setUser("db2admin");
            cpds.setPassword("db2admin");

            SharedPoolDataSource tds = new SharedPoolDataSource() {};
            //SharedPoolDataSource tds = new SharedPoolDataSource();
            tds.setConnectionPoolDataSource(cpds);
            tds.setMaxActive(10);
            tds.setMaxIdle(10);
            tds.setMaxWait(10000);

            ictx = new InitialContext();

            Context ic = ictx;

            String jndiName = JNDINAME;

            int i = -1;
            while (-1 != (i = jndiName.indexOf('/', i 1))) {
                String s2 = jndiName.substring(0, i);
                try {
                    ic.createSubcontext(s2);
                } catch (NameAlreadyBoundException e) {
                    System.err.println(e);
                }
            }
            ictx.bind(jndiName, tds);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

}