2016-05-25 44 views
0

我已经为我的客户端(android应用程序)编写了一个REST风格的web api来使用。 我需要实现另一个应用程序,一个本地桌面应用程序,它访问已为服务器端实现的Databases类。如何在本地运行Web应用程序代码?

我不知道该怎么办。

具体来说,这个类服务器端:

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应用程序? (或者,如何解决这个问题?)

回答

1

如果你谈论的是运行像一个控制台应用程序我通过设置情境解决它手动通过调用方法主要是看起来是这样的:

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) { 

      } 
     } 

编辑:

使用此方法通过调用它首先在主而得到这些数据源后,应该工作

public static void main(String[] args) { 

     setupInitialContext(); 

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

} 

PS:我想我找到这种方式在StackOverflow以及但老实说不记得在哪里:(

+0

这就是我的意思,是的。但是请注意,4行代码被复制,并且最重要的是方法查找应该返回一个对象,这是最后一个方法的错误,我假设没有发现任何东西,然后返回null,但我不确定(虽然也可能通过?)。如果你可以在你的答案中解决这个问题,我会很感激,现在我会尽量多谢你帮助你,可能为我节省了很多时间:) –

+0

编辑返回null或抛出异常。至于重复的行,他们只是一个例子,如果你愿意的话,你可以放置多个数据源(一个就足够了),我也用注释编辑它。 – chehh984

+0

确定有一个问题:如果我调用initContext.lookup(“jdbc/SomeDB”)的类本身,那么它在本地工作,但不在服务器上(它引发NameNotFoundException:名称[jdbc/nasdaq_companies]未绑定在此上下文中。无法找到[jdbc]。)。如果我使用ctx.lookup(“java:comp/env/jdbc/nasdaq_companies”),那么它在服务器上工作,但不在本地:(我需要这个类在本地和服务器上工作:P –

相关问题