Вытаскиваем DataSource из JNDI на JBoss

10 Фев
2012

Не так давно пришлось столкнуться с написанием некоторого приложения с web интерфейсом, DataSource в котором надо было получать посредством JNDI. В качестве контейнера сервлетов, использовал Tomkat. Работала эта конструкция «чётко» и замечательно.

Буквально пару дней назад потребовалось опробовать это приложение на JBoss и WebSphere. По идее полученный ранее warник должен был заработать без помех и проблем сдесь (естественно предварительно не забыв скинуть нужные библиотеки в нужные места0). Ан нет. Оказалось не всё так позитивно и тривиально, как казалось…

Расскажу по подробней как повёл себя JBoss и как с ним велись недетские разборки.

Начну с самого начала. Моё приложение содержало всё необходимое для получения необходимого DataSourse, а именно файл context.xml с необходимым содержимым и web.xml также сдержал нужную информацию.

Если, кто не знает как это устроено в Tomkat привожу свой код:
context.xml должен иметь вид:


<Resource name=«jdbc/myoracle» auth=«Container»
type=«javax.sql.DataSource» driverClassName=«oracle.jdbc.OracleDriver»
url=«jdbc:oracle:thin:@localhost:1521:xe»
username=«username» password=«password» maxActive=«20» maxIdle=«10»
maxWait=»-1″/>



web.xml помимо описания сервлетов и прочей должен содержать в себе следующий кусок:

<resource-ref>
Oracle Datasource example
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>


Ну так вот скинув библиотеку для oracle в lib уже в JBoss и «закинув» свой warник в папку «deploy», я наивно предполагал, что моё приложение запахает. Увы не тут-то было. Посыпались жуткие-прижуткие эксепшены. Если вкратце, то говорилось в них, что ничего не найдено по имени «jdbc/myoracle».

Пришлось «нырять» в эту тему, как говорится с головой. Скажу честно, что перерыл массу форумов и ссылок, но ни один нормально всю картину не прояснял. Примерно после 5-6 часов!!! нашёл что-то вменяемое, что помогло решить мою проблему (где нашёл уже не помню, но там тоже не самым идеальным образом было объяснено как действовать, но всё же лучше, чем ничего).

В общем ниже привожу решение данной проблемы:

1. Найти файл server.xml в папке $JBOSS_HOME\server\default|all|minimal\deploy\jboss-web.deployer (лично у меня default, поэтому дальше описывать буду для default. Для других случаев, уверен, что дела обстоят аналогично). В файл server.xml добавляем кусок, хранившейся у нас в context.xml:

<Resource name=«jdbc/myoracle» auth=«Container»
type=«javax.sql.DataSource» driverClassName=«oracle.jdbc.OracleDriver»
url=«jdbc:oracle:thin:@localhost:1521:xe»
username=«username» password=«password» maxActive=«20» maxIdle=«10»
maxWait=»-1″/>


2.В папку с задеплоенными приложениями добавить файл oraclel-ds.xml следующего вида:

<local-tx-datasource>
<jndi-name>jdbc/myoracle</jndi-name>
<connection-url>jdbc:oracle:thin:@localhost:1521:xe</connection-url>
<driver-class>oracle.jdbc.OracleDriver</driver-class>
<user-name>username</user-name>
password
<type-mapping>Oracle</type-mapping>

</local-tx-datasource>


Замечание: oraclel-ds.xml — имя файла для бд Oracle. Для остальных файлом должны быть соответствующими используемым СУБД.

3. Третий пункт самый неприятный, так как пришлось лезть в war файл. В папку WEB-INF прямо под бок файлу web.xml следует добавить файл jboss-web.xml следующего содержания:

<jboss-web>
<resource-ref>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<jndi-name>java:jdbc/myoracle</jndi-name>
</resource-ref>
</jboss-web>


Впринципе всё. Создав заново war файл и забросив его в папку deploy, всё заработало!

Если есть какие-то вопросы, дополнения, уточнения или просто хотите оставить комментарий — милости просим в комменты.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх