Настройка Spring WebApplicationContext в bean-компоненте ServletContextAware - PullRequest
0 голосов
/ 05 марта 2011

Я конвертирую существующий код в 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()?

Я что-то упускаю из виду или просто слишком многого ожидаю?

1 Ответ

0 голосов
/ 05 марта 2011

Зачем тебе это вообще нужно?

Если ваш класс - боб, вы можете просто внедрить (@Inject, @Autowired или xml) шаблон jdbc:

@Inject
private SimpleJdbcTemplate template;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...