【问题标题】:Spring 3.0 injection null after initalizationSpring 3.0 初始化后注入null
【发布时间】:2011-03-29 07:23:11
【问题描述】:

我正在尝试将数据源对象注入 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。

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

请指教! 提前致谢!

【问题讨论】:

  • 如果您仅尝试使用 setDataSource 或仅使用 setTest(完全删除另一个的所有初始化),它是否也会失败?只是为了缩小问题

标签: spring ioc-container spring-3


【解决方案1】:

您有两个 servlet 实例:

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

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

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

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

【讨论】:

  • 对,完全忘了我必须让 Spring 意识到这一点。为了解决这个问题......我让我的 servlet 实现了控制器并在我的 spring-servlet.xml 配置中指定它。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
相关资源
最近更新 更多