Я конвертирую существующий код в JDBC Spring 3. Я поместил его в класс (SpringDB.Users), который реализует ServletContextAware. В setServletContext () следующий код не работает:
public void setServletContext(ServletContext sc)
{
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
simpleJdbcTemplate = (SimpleJdbcTemplate) wac.getBean("simpleJdbcTemplate");
}
Причина: исключение: java.lang.IllegalStateException: не найден WebApplicationContext: нет зарегистрированного ContextLoaderListener?
Однако я зарегистрировал ContextLoaderListener в web.xml:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
В applicationContext.xml есть это:
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/mysql"/>
<bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg>
<ref bean="dataSource"/>
</constructor-arg>
</bean>
<bean class="SpringDB.Users"/>
, что приводит к получению вызова setServletContext (). Класс SpringDB.Users в основном статический материал. Он никогда не создается экземпляром Java-кода.
Видимо, вызов WebApplicationContextUtils.getRequiredWebApplicationContext () "слишком ранний". Потому что то, что работает без каких-либо проблем, - это получить WebApplicationContext в более позднее время, то есть когда работа с базой данных действительно начинается, поэтому я вызываю частную функцию getSimpleJdbcTemplate () вместо закрытой переменной simpleJdbcTemplate:
static private SimpleJdbcTemplate getSimpleJdbcTemplate ()
{
if (simpleJdbcTemplate == null)
{
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
simpleJdbcTemplate = (SimpleJdbcTemplate) wac.getBean("simpleJdbcTemplate");
}
return simpleJdbcTemplate;
}
Есть ли какое-либо решение, чтобы переменная simpleJdbcTemplate могла быть инициализирована в setServletContext()
?
Я что-то упускаю из виду или просто слишком многого ожидаю?