0

我正在将现有代码转换为 Spring 3 JDBC。我已将它放入实现 ServletContextAware 的类 (SpringDB.Users) 中。在 setServletContext() 中,以下代码不起作用:

public void setServletContext(ServletContext sc)
{
    WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
    simpleJdbcTemplate = (SimpleJdbcTemplate) wac.getBean("simpleJdbcTemplate");
}

原因是:异常是 java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?

但是我确实在 web.xml 中注册了一个 ContextLoaderListener:

<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()

我是否遗漏了一些明显的东西,或者只是期待太多?

4

1 回答 1

0

为什么你首先需要它?

如果您的类是 bean,那么您可以简单地注入(使用@Inject@Autowiredxml)jdbc 模板:

@Inject
private SimpleJdbcTemplate template;
于 2011-03-05T20:27:50.917 回答