既存のコードを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");
}
理由は次のとおりですが見つかりませんWebApplicationContext:例外はjava.lang.IllegalStateExceptionで何のContextLoaderListenerが登録されていませんか? applicationContext.xmlをこれを持っている
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
:setServletContext()の呼び出しを取得し、その結果
<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"/>
は、しかし、私は、web.xml内のContextLoaderListenerを登録しました。 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()
内で初期化できるようにするソリューションはありますか?
明らかなものがないか、あまり期待しすぎていますか?
がコンパイルされません静的コンテキスト "と呼ばれる。私が言ったように、クラスはインスタンス化されません。静的変数として、 "Autowired注釈は静的フィールドではサポートされていません"。私はおそらく単に呼び出すBean内でgetBean()を実行するだけで問題を解決できるかもしれないが、私はデータベースBeanの外部でコードを変更しないようにしています。 –
@Tilman Hausherrもちろん、すべての静的コンテキストを取り除いてください。なぜあなたはそれが必要なのですか? – Bozho
データベースBeanの外部にある既存のコードを変更しないようにしていたためです。そのコードは決してデータベースクラスをインスタンス化せず、静的呼び出しを使用するだけで、これらのクラスには変数もありません。はい、あなたの提案は非静的変数を持つクラスで動作します。私は、静的呼び出しが通常は「クリーンコード」の教授法のようにノー・ノーであることを知っていますが、私は既存のコードをゆっくりと改善しようとしています –