java - 如何在本地运行网络应用程序代码?

标签 java mysql jdbc server

我已经编写了一个 RESTful Web API 供我的客户端(Android 应用程序)使用。 我需要实现另一个应用程序,一个本地桌面应用程序,它访问已为服务器端实现的Databases 类。

我不知道该怎么做。

具体来说,此类用于服务器端:

public Database(String TableName, String KeyName) throws SQLException, NamingException {
  mTableName = TableName;
  mKeyName = KeyName;

  InitialContext ctx = new InitialContext();
  DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/nasdaq_companies");
}

现在抛出了一个异常(NoInitialContextException),这是完全有道理的,因为我缺少 context.xml 或者特别是在其中缺少此资源

<Resource name="jdbc/nasdaq_companies" auth="Container"
          type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/nasdaq_companies"
          username="*****" password="*****" maxActive="20" maxIdle="10" maxWait="-1"/>

假设服务器== localhost,如何将上下文资源添加到本地java应用程序? (否则,我该如何解决这个问题?)

最佳答案

如果您正在谈论运行类似控制台应用程序之类的东西,我通过调用 Main 中的方法手动设置上下文来解决它,如下所示:

    public 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/SomeDB");
                                            ds.setUser("dbuser");
                                            ds.setPassword("dbpass");
                                            dataSources.put("jdbc/SomeDataSourceName", ds); 
    //lets add another datasource (optional)
                                            MysqlConnectionPoolDataSource ds = new MysqlConnectionPoolDataSource();
                                            ds.setURL("jdbc:mysql://localhost:3306/OtherDB");
                                            ds.setUser("dbuser");
                                            ds.setPassword("dbpass");
                                            dataSources.put("jdbc/OtherDataSourceName", ds);    
//you can keep adding these as you need                                         
                                        }

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

                                        return null; //or throw exception Java style :)
                                    }
                                };
                            }

                        };
                    }

                });
            }
            catch (NamingException ne) {

            }
        }

编辑:

您可以通过首先在 Main 中调用此方法来使用此方法,然后获取这些数据源应该可以工作

public static void main( String[] args ) {

        setupInitialContext();

        Context initContext = new InitialContext();        
        DataSource dataSource = (DataSource) initContext.lookup("jdbc/SomeDB");

}

PS:我想我也在 StackOverflow 上找到了这种方法,但说实话我不记得在哪里了:(

关于java - 如何在本地运行网络应用程序代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37443581/

相关文章:

php - 如何将动态谷歌地图添加到我的网站?

java - 在 preparedStatement 中编辑查询

java - 事务回滚异常

java - "Choose File"更改权限后按钮不起作用

java - 如何记录 JUnit 测试方法的每个语句

java - 在 jar 中嵌入 hibernate hbm.xml 映射

mysql - 访问: Merging similar records

mysql - 从 TinyMCE 发送的数据没有以正确的格式保存

Java JOptionPane 默认文本

database - Apache Shiro 中每个用户的不同权限?