既存のコードをSpring3JDBCに変換しています。ServletContextAwareを実装するクラス(SpringDB.Users)に入れました。setServletContext()では、次のコードは機能しません。
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()
か?
明らかな何かが欠けているのでしょうか、それとも単に期待しすぎているのでしょうか。