私は過去に J2EE コーディングを行っていた人で、新しい J2EE プロジェクトに取り組むために戻ってきました。2001 年以降、多くのことが変わったので、この非常に基本的な質問をする必要があります。
データベースクラスで次のような構文を使用しています。
@Resource(name = "jdbc/MyDatabase")
private javax.sql.DataSource dataSource;
これが新しい機能 (注釈) であることは理解していますが、どのように機能するのかよくわかりません。後で私のクラスで私はこの呼び出しを行います:
Connection c = dataSource.getConnection();
そして、毎回 NullPointerException をスローします。デバッガーでこれにステップインすると、結局のところ、dataSource は null です。
コードで自分で dataSource を初期化しないのは魔法のようで奇妙に思えます。私が間違っていることは何か分かりますか?
私の web.xml には、リソースを確立するための次のブロックが含まれています。
<resource-env-ref>
<resource-env-ref-name>jdbc/MyDatabase</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>
そして、META-INF の context.xml ファイルを使用して、これをコンテキストに追加しました。コンテキスト エントリは次のようになります。
<Resource name="jdbc/MyDatabase" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="username" password="password" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/mydb?autoReconnect=true"/>
Tomcat 6、MySQL 5、最新の MySQL ドライバー (古い v3 ではなく、最新の v5 ドライバー) を使用しています。
更新: 単純なクラスで使用しているため、これは機能しません。新しいプロジェクトを作成し、それにサーブレットを追加しました。サーブレットで DataSource が null でない。