2011-03-05 63 views
0

我将现有代码转换为Spring 3 JDBC。我把它放到一个实现ServletContextAware的类(SpringDB.Users)中。在setServletContext(),下面的代码无法正常工作:Spring设置ServletContextAware bean中的WebApplicationContext

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

的原因是:例外的是java.lang.IllegalStateException:没有找到的WebApplicationContext:没有注册ContextLoaderListener的?

但是我没有注册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中,即当数据库的工作真正开始 - 所以我要做的就是打电话,而不是私有变量了SimpleJdbcTemplate私有函数getSimpleJdbcTemplate():

static private SimpleJdbcTemplate getSimpleJdbcTemplate() 
{ 
    if (simpleJdbcTemplate == null) 
    { 
     WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); 
     simpleJdbcTemplate = (SimpleJdbcTemplate) wac.getBean("simpleJdbcTemplate"); 
    } 
    return simpleJdbcTemplate; 
} 

有没有解决方案,以便变量simpleJdbcTemplate可以在setServletContext()内初始化?

我错过了一些明显的东西,或者只是期待太多?

回答

0

为什么你首先需要这个?

如果你的类是豆类,那么你可以简单地注入(与@Inject@Autowired或XML)的JDBC模板:

@Inject 
private SimpleJdbcTemplate template; 
+0

不编译,因为“非静态变量模板不能从内引用一个静态的上下文“。正如我所说的,这个类永远不会被实例化。作为静态变量,“静态字段不支持”Autowired注释“。我知道我可以通过简单地在调用bean中做一个getBean()来解决问题,但我试图不改变数据库bean之外的代码。 – 2011-03-05 21:12:59

+0

@Tilman Hausherr当然 - 摆脱所有静态环境。你为什么需要它? – Bozho 2011-03-05 21:15:25

+0

因为我试图不改变数据库bean之外的现有代码。该代码从不实例化数据库类,它只是使用静态调用,这些类甚至没有任何变量。是的,你的建议可以在一个非静态变量的类中工作。我意识到,静态调用通常是一个禁止按照“清洁代码”的教学,但我试图改进现有的代码缓慢。(更多在下一个评论) – 2011-03-05 22:12:00

相关问题