2011-03-05 10 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"); 
} 

理由は次のとおりですが見つかりません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()内で初期化できるようにするソリューションはありますか?

明らかなものがないか、あまり期待しすぎていますか?

答えて

0

なぜ最初にその必要がありますか?

あなたのクラスがBeanであれば、あなたは、単にJDBCテンプレート(@Inject@AutowiredまたはXMLで)注入することができる:非静的変数テンプレートは内から参照することはできません」ので

@Inject 
private SimpleJdbcTemplate template; 
+0

がコンパイルされません静的コンテキスト "と呼ばれる。私が言ったように、クラスはインスタンス化されません。静的変数として、 "Autowired注釈は静的フィールドではサポートされていません"。私はおそらく単に呼び出すBean内でgetBean()を実行するだけで問題を解決できるかもしれないが、私はデータベースBeanの外部でコードを変更しないようにしています。 –

+0

@Tilman Hausherrもちろん、すべての静的コンテキストを取り除いてください。なぜあなたはそれが必要なのですか? – Bozho

+0

データベースBeanの外部にある既存のコードを変更しないようにしていたためです。そのコードは決してデータベースクラスをインスタンス化せず、静的呼び出しを使用するだけで、これらのクラスには変数もありません。はい、あなたの提案は非静的変数を持つクラスで動作します。私は、静的呼び出しが通常は「クリーンコード」の教授法のようにノー・ノーであることを知っていますが、私は既存のコードをゆっくりと改善しようとしています –

関連する問題