0

既存のコードを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()か?

明らかな何かが欠けているのでしょうか、それとも単に期待しすぎているのでしょうか。

4

1 に答える 1

0

そもそもなぜそれが必要なのですか?

クラスがBeanの場合は、jdbcテンプレートを(またはxmlで)@Inject注入するだけです。@Autowired

@Inject
private SimpleJdbcTemplate template;
于 2011-03-05T20:27:50.917 に答える