5

TomEE は、Tomcat の軽量なエクスペリエンスと Java EE 機能を組み合わせた優れたプロジェクトです。context.xml で宣言された多くの JDBC データソースがありますが、JNDI を介してそのデータソースを使用したい場合、例外が発生します。では、どうすれば TomEE の context.xml で宣言された JDBC データソースを動作させることができますか?

context.xml で宣言されたデータソース

 <Resource auth="Container" 
        name="local_jdbc_db"  
        type="javax.sql.DataSource" 
        driverClassName="com.mysql.jdbc.Driver"  
        url="jdbc:mysql://localhost:3306/mydb" 
        username="user" 
        password="pass"      /> 

JNDI からデータソースを取得するコード

Context contextoInicial = new InitialContext();
Context contexto = (Context) contextoInicial.lookup("java:comp/env");
DataSource ds= (DataSource) contexto.lookup("local_jdbc_db");
4

3 に答える 3

4

更新TomEEでこのまれな問題を抱えている人だけに:context.xmlでデータソースを作成し、TomEE JAX-RSバージョン1.5.0に展開しようとしましたが、運が悪く、常にnullポインタ例外がスローされ、データソース名が見つかりません. 最近、TomEE JAX-RS バージョン 1.6.0 で同じことを試しました。context.xml にデータソースを作成し、このコードで単純なサーブレットを作成しました。

     Context initContext = new InitialContext();
     Context envContext = (Context) initContext.lookup("java:/comp/env");
     DataSource dataSource = (DataSource) envContext.lookup("jdbc_northwind");
     try (Connection conn = dataSource.getConnection(); 
           Statement s = conn.createStatement();
           ResultSet rs = s.executeQuery("select * from customers")) {
           while (rs.next()) {
                out.print(rs.getString("CompanyName"));
                out.print("<br>");
           }         
       } 

...サーバーを起動して万歳!!!! 結果が表示されます!しかし、アプリケーションを再デプロイしたときに古い例外 (DataSource が見つからない、null ポインター例外) が表示されるため、少しがっかりしました。

  <resource-ref>
        <res-ref-name>jdbc_northwind</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref> 

サーバーを再起動すると...動作し、アプリケーションを再デプロイすると非常にうまく動作します!しかし、この動作は非常に奇妙です.Tomcatでは、web.xmlでデータソースを宣言したことがなく、データソースに問題はありません. 多分バグ?

更新: バグであることが確認されました。TomEE 1.6.1 で解決されるようです。更新 2: TomEE 1.7.0 で解決されました。

于 2014-01-26T03:27:55.157 に答える