独立Java程序中的Initialcontext

Sat*_*ala 20 java tomcat jndi connection-pooling java-ee

我正在使用JNDI来创建tomcat连接池.它在Web应用程序中运行良好.我相信InitialContext是由tomcat服务器提供的.

Context initContext  = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:/comp/env");
dataSource = (DataSource)envContext.lookup("jdbc/testdb");
Run Code Online (Sandbox Code Playgroud)

但是当我尝试从独立的Java程序调用相同的实用程序时,initContext对象为null.如何显式提供Context对象所期望的所有必需属性.

错误:javax.naming.NoInitialContextException:需要在环境或系统属性或applet参数或应用程序资源文件中指定类名:java.naming.factory.initial

小智 24

这是一个根据已接受的答案进行调整的示例,但是为了避免创建额外的类而内联所有内容.

public static void main(String[] args) {
    setupInitialContext();
    //do something that looks up a datasource
}

private static void setupInitialContext() {
    try {
        NamingManager.setInitialContextFactoryBuilder(new InitialContextFactoryBuilder() {

            @Override
            public InitialContextFactory createInitialContextFactory(Hashtable<?, ?> environment) throws NamingException {
                return new InitialContextFactory() {

                    @Override
                    public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException {
                        return new InitialContext(){

                            private Hashtable<String, DataSource> dataSources = new Hashtable<>();

                            @Override
                            public Object lookup(String name) throws NamingException {

                                if (dataSources.isEmpty()) { //init datasources
                                    MysqlConnectionPoolDataSource ds = new MysqlConnectionPoolDataSource();
                                    ds.setURL("jdbc:mysql://localhost:3306/mydb");
                                    ds.setUser("mydbuser");
                                    ds.setPassword("mydbpass");
                                    dataSources.put("jdbc/mydbname", ds);

                                    //add more datasources to the list as necessary
                                }

                                if (dataSources.containsKey(name)) {
                                    return dataSources.get(name);
                                }

                                throw new NamingException("Unable to find datasource: "+name);
                            }
                        };
                    }

                };
            }

        });
    }
    catch (NamingException ne) {
        ne.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 恭喜!最佳解决方案,干净简单! (3认同)
  • 一个伟大的内联解决方案的upvote :-) (2认同)
  • 这节省了我通过Java的神秘API搜索的时间.谢谢! (2认同)

Pau*_*gas 8

您还可以创建自己的自定义上下文.

LocalContext ctx = LocalContextFactory.createLocalContext();
ctx.addDataSource("jdbc/testdb", driverName, url, usr, pwd);
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅使用Application Server数据源的本地运行Bean.


新 UPDATE

你可以使用org.springframework.mock.jndi.SimpleNamingContextBuilderSpring 类.例如: