2016-05-25 94 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 –

相關問題