0

我正在尝试将数据源对象注入 servlet。我有记录器以 set 方法打印。它在预初始化时工作正常。但是当我请求 servlet 时,它给了我 nullPointerException。

关于为什么会发生这种情况的任何建议?(我认为这与我正在扩展的 servlet 无关)

这是 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

您有两个 servlet 实例:

  • 一个由 Spring 管理,已DataSource正确注入
  • 第二个由 Tomcat 创建,它对 Spring 一无所知(并且没有DataSource

实际上,如果您使用@Resource而不是@AutowiredTomcat(在 7.0 上测试)会尖叫DataSource未绑定到 JNDI(这证明它是管理 servlet 生命周期的 servlet 容器)。

您的问题是您想将 Spring bean 注入到完全不受 Spring 控制的对象中。这个问题有几种解决方法:

如果您不想深入研究 MVC,我建议您使用HttpRequestHandlerServlet. 这里:1 , 2是一个例子(应该也适用于 Servlet 3.0 之前的版本)

于 2011-03-29T07:32:24.850 回答