Spring 3.0初始化后注入null

时间:2011-03-29 07:23:12

标签: spring ioc-container spring-3

我正在尝试将数据源对象注入servlet。我有使用set方法打印的记录器。它适用于pre-inialization。但是当我请求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>

servlet

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。但是当实际对象被请求时。它不会破坏@testTest。

为什么会这样? (单例/范围问题相关吗?)

请指教! 提前谢谢!

1 个答案:

答案 0 :(得分:6)

您有两个servlet实例:

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

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

您的问题是您希望将Spring bean注入完全超出Spring控件的对象。这个问题有几种解决方法:

如果您不想深入了解MVC,我建议HttpRequestHandlerServlet。这里:12是一个示例(也应该与Servlet 3.0之前的版本一起使用)