Spring 3.0 впрыск нулевой после инициализации - PullRequest
0 голосов
/ 29 марта 2011

Я пытаюсь внедрить объект источника данных в сервлет. У меня есть регистратор для печати в заданном методе. Работает нормально при предварительной инициализации. Но когда я запрашиваю сервлет, он дает мне исключение nullPointerException.

Любое предложение о том, почему это произошло? (Я не думаю, что это связано с сервлетом, который я расширяю)

Вот приложениеContext.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.

Почему это так? (синглтон / сфера связана?)

Пожалуйста, сообщите! Заранее спасибо!

1 Ответ

6 голосов
/ 29 марта 2011

У вас есть два экземпляра вашего сервлета:

  • один управляется Spring, в который правильно введено DataSource
  • второй создан Tomcat и ничего не знает о Spring (и не имеет DataSource)

На самом деле, если вы будете использовать @Resource вместо @Autowired Tomcat (протестирован на 7.0) будет кричать, что DataSource не привязан к JNDI (что доказывает, что именно контейнер сервлета управлял жизненным циклом сервлета.

Ваша проблема заключается в том, что вы хотите внедрить бины Spring в объект, который полностью находится вне контроля Spring.Есть несколько способов решения этой проблемы:

Если вы не хотите погружаться в MVC, я бы предложил HttpRequestHandlerServlet.Здесь: 1 , 2 является примером (также должен работать с сервлетом до 3.0)

...