Мое приложение Java EE 7, использующее Spring, работает на Tomcat 7. Оно обращается к базе данных с помощью источника данных JNDI, определенного этой строкой в context.xml:
<Resource auth="Container" driverClassName="org.postgresql.Driver" maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/leadmanager" password="xxxxxxxx" type="javax.sql.DataSource" url="jdbc:postgresql://localhost:5432/leadmanager" username="postgres"/>
Я создал несколько тестов JUnit. Когда я попытался запустить их (в Eclipse, щелкнув правой кнопкой мыши тестовый класс и выбрав Run As | JUnit Test), возникло исключение:
javax.persistence.PersistenceException: [PersistenceUnit: leadmanager] Unable to build EntityManagerFactory
...
Caused by: org.hibernate.service.jndi.JndiException: Error parsing JNDI name [java:/comp/env/jdbc/leadmanager]
...
Caused by: javax.naming.NoInitialContextException: 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
...
Спасибо за этот полезный пост -- https://blogs.oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit -- Я нашел решение. Я добавил это в свой тестовый класс:
@BeforeClass
public static void setUpClass() throws Exception {
// create initial context
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming");
InitialContext ic = new InitialContext();
ic.createSubcontext("java:");
ic.createSubcontext("java:/comp");
ic.createSubcontext("java:/comp/env");
ic.createSubcontext("java:/comp/env/jdbc");
PGPoolingDataSource ds = new PGPoolingDataSource();
ds.setServerName("localhost:5432/leadmanager");
ds.setUser("postgres");
ds.setPassword("xxxxxxxx");
ic.bind("java:/comp/env/jdbc/leadmanager", ds);
}
Но это ужасно! Мне приходится определять источник данных дважды, один раз в context.xml и еще раз в моем тестовом классе. И я вынужден хранить свой пароль базы данных в коде Java, который будет проверен в системе управления версиями.
Я уже ознакомился с этим сообщением: Настройка источника данных JNDI в jUnit
Есть ли способ лучше?