我正在尝试将数据源对象注入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。
为什么会这样? (单例/范围问题相关吗?)
请指教! 提前谢谢!
答案 0 :(得分:6)
您有两个servlet实例:
DataSource
正确注入DataSource
)实际上如果你使用@Resource
而不是@Autowired
Tomcat(在7.0上测试)会尖叫DataSource
没有绑定到JNDI(这证明它是管理它的servlet容器servlet生命周期)。
您的问题是您希望将Spring bean注入完全超出Spring控件的对象。这个问题有几种解决方法:
DispatcherServlet
和Spring MVC HttpRequestHandlerServlet
发送处理Spring bean的所有请求WebApplicationContextUtils
并手动取豆(令人讨厌的解决方案)如果您不想深入了解MVC,我建议HttpRequestHandlerServlet
。这里:1,2是一个示例(也应该与Servlet 3.0之前的版本一起使用)