У меня есть приложение, которое я использую для создания отчетов, теперь мне нужно переместить это приложение в веб-среду.
Для этого я использую 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
В 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");
"Не уверен, что это ошибка, но у вас, вероятно, есть опечатка:
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");