#java #tomcat #jakarta-ee #datasource #jndi
#java #tomcat #джакарта-ee #источник данных #jndi
Вопрос:
Я искал в Google и stackoverflow для этой проблемы, есть несколько вопросов, но они не приводят к конкретному решению и причине, стоящей за причиной. Я делаю проект в JSF с контекстом для моего проекта, определенным в C:apache-tomcat-6.0.32confCatalinalocalhost
.
Также в моем web.xml
У меня есть следующая конфигурация:
<context-param>
<description>Database server name</description>
<param-name>DATABASE</param-name>
<param-value>MYSQL</param-value>
</context-param>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/MySqlDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Теперь контекстный файл для этого проекта выглядит следующим образом:
<Context path="/SMS" debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/MySqlDS" auth="Container"
type="javax.sql.DataSource" removeAbandoned="true"
removeAbandonedTimeout="30" maxActive="100"
maxIdle="30" maxWait="10000" username="root"
password=""
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/rosebud"/>
</Context>
Код в моем контроллере является :
InitialContext initialContext = new InitialContext();
Context envContext = (Context)initialContext.lookup("java:/comp/env");
javax.sql.DataSource ds = (javax.sql.DataSource) envContext.lookup("jdbc/MySqlDS");
java.sql.Connection conn = ds.getConnection();
Вот мой stacktrace:
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Не удается создать драйвер JDBC класса » для URL-адреса подключения «null» в org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory (BasicDataSource.java:1452) в org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource (BasicDataSource). BasicDataSource.java: 1371) в org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) в com.isys.common.navigation.dao.mysql.TmpNavDAOMySql.getConnection(TmpNavDAOMySql.java: 91) в com.isys.common.navigation.dao.mysql.TmpNavDAOMySql.populateModels(TmpNavDAOMySql.java:114) в com.isys.common.navigation.dao.mysql.TmpNavDAOMySql.populateNavModules(TmpNavDAOMySql.java:19) в com.isys.common.navigation.dao.mysql.TmpNavDAOMySqlImpl.populateNavModules(TmpNavDAOMySqlImpl.java:11) в com.isys.common.navigation.controller.TmpNavGenerator.init(TmpNavGenerator.java:12) в org.apache.catalina.core.StandardWrapper.loadServlet (StandardWrapper.java: 1173) в org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java: 993) в org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java: 4420) в организации.apache.catalina.core.StandardContext.start(StandardContext.java: 4733) в org.apache.catalina.core.База контейнеров.запуск (ContainerBase.java: 1053) в org.apache.catalina.core.StandardHost.start(StandardHost.java: 840) в org.apache.catalina.core.База контейнеров.запуск (ContainerBase.java: 1053) в org.apache.catalina.core.StandardEngine.start(StandardEngine.java: 463) в org.apache.catalina.core.StandardService.start(StandardService.java:525) в org.apache.catalina.core.StandardServer.start(StandardServer.java: 754) в org.apache.catalina.startup.Catalina.start (Catalina.java: 595) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (неизвестный источник) в sun.reflect.Делегирование methodaccessorimpl.invoke (неизвестный источник) на java.lang.reflect.Метод.invoke (неизвестный источник) в org.apache.catalina.startup.Bootstrap.start(Bootstrap.java: 289) в org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414), вызванный: java.lang.Исключение NullPointerException в sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(неизвестный источник) в sun.jdbc.odbc.JdbcOdbcDriver.knownURL (неизвестный источник) в sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL (неизвестный источник) в java.sql.DriverManager.getDriver (неизвестный источник) в org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory (BasicDataSource.java: 1437) … еще 24
Конфигурация работает нормально, если я запускаю tomcat извне eclipse, но завершается сбоем при запуске из eclipse. Что может быть причиной?
Комментарии:
1. Теперь, когда я изменил настройки сервера в eclipse, весь мой проект был удален: (
Ответ №1:
Посмотрите на основную причину исключения:
Caused by: java.lang.NullPointerException at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(Unknown Source) at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(Unknown Source) at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(Unknown Source) at java.sql.DriverManager.getDriver(Unknown Source) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437) ... 24 more
Этот NPE, очевидно, является ошибкой в драйвере Sun JDBC ODBC bridge. Он должен был обработать это более изящно или выдать более понятное исключение.
Но более серьезной проблемой само по себе является то, что Tomcat datasource manager использует драйвер Sun JDBC ODBC bridge вместо драйвера MySQL JDBC, который вы указали в driverClassName
из <Resource>
! Это означает, что <Resource>
вообще неправильно найдено / интерпретировано Tomcat. Вы должны поместить context.xml
файл в /META-INF
папку вашего веб-приложения. Или вы должны поместить <Resource>
внутри <Context>
tomcat/conf/context.xml
файла.
Комментарии:
1. На самом деле проект имеет это отдельно «myapp.xml «Я, как упоминалось в apache-tomcat-6.0.32 conf Catalina localhost , который работает, если tomcat развернут не из eclipse, т. е. если я развертываю приложение извне eclipse IDE, но не изнутри IDE. Когда я запустил TOMCAT из eclipse, он удалил файл конфигурации в папке, а теперь и проект. Я был бы рад, если бы вы могли предоставить какой-нибудь четкий insite в нем. Поскольку я также изучал ваше предыдущее решение в других потоках, но не смог понять : (.
2. Как я уже ответил, это должно быть в webapp
/META-INF/context.xml
. Вы можете просто создать файл и папку самостоятельно, если они не существуют.3. да! Я понял, но почему он работает при развертывании из внешней среды IDE?
4. Потому что Eclipse по умолчанию использует пространство метаданных рабочей области для развертывания веб-приложения. Вам нужно было бы перенастроить Eclipse, чтобы вместо этого использовать местоположение установки Tomcat. Дважды щелкните Tomcat в Eclipse, чтобы получить конфигурацию сервера, в разделе » Расположения серверов » вы должны выбрать » Использовать установку Tomcat «.
5. При использовании метаданных рабочей области вам следует скорее редактировать файлы в проекте Eclipse » Серверы «, а не в самом Tomcat. Именно Eclipse не будет их использовать. Для этого вы должны настроить Eclipse для использования установки Tomcat, как описано в предыдущем комментарии.