0

データソース オブジェクトをサーブレットに挿入しようとしています。set メソッドで出力するロガーがあります。事前初期化で問題なく動作します。しかし、サーブレットをリクエストすると、nullPointerException が返されます。

なぜこれが起こるのかについて何か提案はありますか? (これは私が拡張しているサーブレットに関連しているとは思わない)

これがapplicationContext.xmlです

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

<bean id="dataServlet" class="com.mycom.util.DataServlet">
    <property name="dataSource" ref="dataSource" />
    <property name="test" value="dataSource" />
</bean>

サーブレット

public class DataServlet extends DataSourceServlet {
...
@Autowired
    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
        logger.log(Level.INFO, "Inj: datasrc");
    }
@Autowired
    public void setTest(String test) {
        this.test = test;
        logger.log(Level.INFO, "Set Test {0}", this.test);
    }
}

ブレークポイント @ setTest を設定すると、@ pre-init が壊れます。しかし、実際のオブジェクトがリクエストされたとき。@ setTest を壊すことはありません。

なぜそうなのですか?(シングルトン/スコープの問題関連?)

お知らせ下さい!前もって感謝します!

4

1 に答える 1

6

サーブレットの 2 つのインスタンスがあります。

  • DataSource適切に注入されたSpringによって管理されるもの
  • Tomcat によって作成された 2 つ目は、Spring について何も知らない (そして を持っていないDataSource)

実際、 Tomcat (7.0 でテスト済み)@Resourceの代わりに使用すると、JNDI にバインドされていない (サーブレットのライフサイクルを管理したサーブレット コンテナーであることを証明する) と叫びます。@AutowiredDataSource

あなたの問題は、Spring Bean を完全に Spring の制御外にあるオブジェクトに注入したいということです。この問題にはいくつかの回避策があります。

MVC に飛び込みたくない場合は、 をお勧めしHttpRequestHandlerServletます。ここで: 1 , 2は例です (3.0 より前のサーブレットでも動作するはずです)。

于 2011-03-29T07:32:24.850 に答える