Tomcat 8.0.15 База данных Oracle 11 и jdbc javax.naming.NamingException

1

У меня есть приложение, которое я использую для создания отчетов, теперь мне нужно переместить это приложение в веб-среду.

Для этого я использую Tomcat 8.0.15 и Oracle Database 11g Enterprise Edition.

В моем TOMCAT_HOME\conf\server.xml у меня есть следующий код:

<Resource auth="Container" 
    driverClassName="oracle.jdbc.OracleDriver" 
    maxIdle="10" 
    maxTotal="20" 
    maxWaitMillis="-1" 
    name="jdbc/reportDataSource" 
    username="some_username"
    password="some_pass" 
    type="javax.sql.DataSource" 
    url="jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = some.host)(PORT = some.port)))(CONNECT_DATA =(SID = SOME_SID)(SERVICE_NAME = SOME_SERVICE)))"/>

Поэтому в моем PROJECT_HOME\WebContent\WEB-INF\web.xml у меня есть следующее:

<resource-ref>
    <description>Oracle Datasource definition</description>
    <res-ref-name>jdbc/reportDataSource</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

Наконец, в моем коде у меня есть класс Java со следующим:

private void init() throws NamingException, SQLException {

    try {

        InitialContext initialContext = new InitialContext(); // JNDI initial context
        Context eventContext = (Context) initialContext.lookup("java:comp/env/jdbc/reportDataSource"); // Event context
        dataSource = (DataSource) eventContext.lookup("jdbc/reportDataSource"); // JNDI lookup          
        databaseConnection = dataSource.getConnection(); // database connection through data source

    } catch (SQLException se) {
        throw new SQLException("Connection object was not created. Rejected by host or not found.");
    } catch (NamingException ne) {
        throw new NamingException(ne.getMessage());
    }
}

Наконец, в корне моего проекта у меня есть следующая тестовая установка:

@Before
public void setUp() throws Exception {

    dbConnectorManager = new DatabaseConnectorManager();
    assertNotNull(dbConnectorManager);
}

Когда я вызываю DatabaseConnectorManager(), он вызывает метод init(), указанный в этом вопросе. Однако, когда я выполняю свой тест, я получил следующую ошибку, связанную с строкой:

entContext eventContext = (Context) initialContext.lookup("java:comp/env/jdbc/reportDataSource"); // Event context

Следовательно, невозможно установить JNDI из-за ошибки:

javax.naming.NamingException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial

Можете ли вы посоветовать, могу ли я создать эти тесты JUnit для тестирования возможности подключения, или если я могу проверить только через сервлет?

Что-то не так с моей конфигурацией?

Обновить

Я сделал желаемые изменения, но теперь я получаю следующую ошибку:

javax.naming.NamingException: Name [jdbc/reportDataSource] is not bound in this Context. Unable to find [jdbc].

Теперь мой источник данных выглядит следующим образом:

InitialContext initialContext = new InitialContext(); // JNDI initial context
        Context eventContext = (Context) initialContext.lookup("java:comp/env"); // Event context
        dataSource = (DataSource) eventContext.lookup("jdbc/reportDataSource"); // JNDI lookup          
        databaseConnection = dataSource.getConnection(); // database connection through data source
  • 0
    Не уверен, что это поможет, но, возможно, взглянем на этот вопрос: stackoverflow.com/questions/744389/…
Теги:
tomcat
jdbc
junit4

2 ответа

0

В Server.xml укажите имя своего ресурса и выполните поиск на основе этого имени. Другое дело, вы можете добавить ресурс в качестве нового context.xml в папку META-INF под webapps. Это делается, если вы не хотите изменять свой server.xml

<Resource name="tomcat/JDBCdatasource" auth="Container"  ... />

Context ctx;
ctx = new InitialContext();
Context envContext = (Context) ctx.lookup("java:/comp/env");   
// Look up a data source
javax.sql.DataSource ds
      = (javax.sql.DataSource) envContext.lookup ("tomcat/JDBCdatasource");
0

"Не уверен, что это ошибка, но у вас, вероятно, есть опечатка:

Context eventContext =
    (Context) initialContext.lookup("java:comp/env/jdbc/reportDataSource"); // Event context
//                                                 ^^^^^^^^^^^^^^^^^^^^^^
dataSource = (DataSource) eventContext.lookup("jdbc/reportDataSource"); // JNDI lookup          
//                                             ^^^^^^^^^^^^^^^^^^^^^^

Либо вы хотите сделать прямой поиск:

dataSource =
  (DataSource) initialContext.lookup("java:comp/env/jdbc/reportDataSource");

Или вы хотите сначала получить контекст, но в этом случае вы запрашиваете только java:comp/env:

Context eventContext =
    (Context) initialContext.lookup("java:comp/env");
dataSource = (DataSource) eventContext.lookup("jdbc/reportDataSource");
  • 0
    Привет Сильвен Леру, спасибо за ваш ответ. Я изменил код, как вы предложили для: InitialContext initialContext = new InitialContext (); // JNDI начальный контекст Context eventContext = (Context) initialContext.lookup ("java: comp / env"); // Контекст события dataSource = (DataSource) eventContext.lookup ("jdbc / reportDataSource"); // JNDI lookup Однако у меня все еще та же ошибка. У меня вопрос, могу ли я найти эти ресурсы в тесте JUnit, или я могу проверить это только через сервлет? С наилучшими пожеланиями, Зиза

Ещё вопросы

Сообщество Overcoder
Наверх
Меню