我将现有代码转换为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()
内初始化?
我错过了一些明显的东西,或者只是期待太多?
不编译,因为“非静态变量模板不能从内引用一个静态的上下文“。正如我所说的,这个类永远不会被实例化。作为静态变量,“静态字段不支持”Autowired注释“。我知道我可以通过简单地在调用bean中做一个getBean()来解决问题,但我试图不改变数据库bean之外的代码。 – 2011-03-05 21:12:59
@Tilman Hausherr当然 - 摆脱所有静态环境。你为什么需要它? – Bozho 2011-03-05 21:15:25
因为我试图不改变数据库bean之外的现有代码。该代码从不实例化数据库类,它只是使用静态调用,这些类甚至没有任何变量。是的,你的建议可以在一个非静态变量的类中工作。我意识到,静态调用通常是一个禁止按照“清洁代码”的教学,但我试图改进现有的代码缓慢。(更多在下一个评论) – 2011-03-05 22:12:00