JNDI и javax.sql.DataSource
Вопрос
В прошлом я занимался программированием J2EE, и сейчас возвращаюсь к работе над новым проектом J2EE.С 2001 года многое изменилось, поэтому мне нужно задать этот очень простой вопрос.
Я использую такой синтаксис в своем классе базы данных:
@Resource(name = "jdbc/MyDatabase")
private javax.sql.DataSource dataSource;
Я понимаю, что это новая функция (аннотации), но я не совсем понимаю, как она работает.Позже в классе я звоню:
Connection c = dataSource.getConnection();
И он каждый раз выдает исключение NullPointerException.Я вхожу в это в отладчике, и оказывается, что dataSource IS 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>
И я добавил это в свой контекст, используя файл context.xml в META-INF.Запись контекста выглядит так:
<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 в сервлете не равен нулю.
Решение
Вам необходимо иметь как минимум следующее в файле сервера приложений: /conf/context.xml
или веб-приложение /META-INF/context.xml
файл:
<Resource
name="jdbc/MyDatabase"
type="javax.sql.DataSource"
driverClassName="com.your.Driver"
url="jdbc:your://url"
username="foo"
password="bar"
/>
Также см http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html
И в веб-приложении /WEB-INF/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>
Редактировать:Теперь я вижу, что вы отредактировали свое сообщение, добавив кодировку.Я также вижу, что вы использовали resource-ref
вместо resource-env-ref
.Первый относится к внешнему ресурсу (читай:не управляемый веб-контейнером), а второй относится к внутреннему (средовому) ресурсу (читай:управляемый веб-контейнером).Замените его и посмотрите.
Другие советы
Определяет ли ваш web.xml ресурс?Взгляни на этот пример.Не могли бы вы опубликовать свой web.xml или код, определяющий jdbc/MyDatabase?