Вопрос

В прошлом я занимался программированием 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?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top