2016-05-25 8 views
0

クライアント(アンドロイドアプリ)にRESTful Web APIを作成しました。 別のアプリケーション(ローカルデスクトップアプリケーション)を実装する必要があります。これは、サーバー側にすでに実装されているクラス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"); 
} 

今、このリソースが

が欠落している、私はその中に、具体的context.xmlにまたはが不足していますので、完璧な理にかなっている(NoInitialContextException)スローされた例外があります
<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) { 

      } 
     } 

EDIT:

あなたはまず自分のメインでそれを呼び出すことによって、この方法を使用し、その後、それらのデータソースを得ることが

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またはスロー例外のために編集されます。重複した行については、複数のデータソースを置くことができるだけの例です(1つあれば十分です)。コメントでも編集しました。 – chehh984

+0

OK問題があります:クラス自体で、initContext.lookup( "jdbc/SomeDB")を呼び出すと、ローカルでは動作しますが、サーバー上では動作しません(NameNotFoundExceptionをスローします:Name [jdbc/nasdaq_companies] 。[jdbc]が見つかりません。) ctx.lookup( "java:comp/env/jdbc/nasdaq_companies")を使用すると、サーバ上では動作しますが、ローカルでは動作しません:(このクラスはローカルとサーバの両方で動作する必要があります:P –

関連する問題