используя @Autowired со статической переменной - PullRequest
0 голосов
/ 11 марта 2012

Я пытаюсь запустить следующее и получить NullPointerException в основной функции. Я не знаю, почему этот метод @Autowired не инициализирует переменную surveyDao. Ниже приведен соответствующий код:

@ContextConfiguration( locations = {"test-context.xml"} )
@TransactionConfiguration(defaultRollback=true)

@Transactional
public class MyTest {    


protected static SurveyDao surveyDao;


@Autowired
public void setSurveyDao(SurveyDao surveyDAO){
    MyTest.surveyDao = surveyDAO;
}


public static void main(String args[]) {
    CollectSurvey survey = surveyDao.load("form");
}

}

Содержимое test-context.xml выглядит следующим образом:

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:security="http://www.springframework.org/schema/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"
    default-lazy-init="true"
    default-autowire="byName">

    <context:annotation-config/>


<!--     <bean id="applicationContextProvider" class="org.openforis.collect.context.ApplicationContextAwareImpl" /> -->

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="file:${user.dir}/dev.properties"/>
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="${collect.devdb.url}"/>
        <property name="username" value="${collect.devdb.username}" />
        <property name="password" value="${collect.devdb.password}" />
    </bean>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <bean id="surveyDao" class="org.openforis.collect.persistence.SurveyDao" init-method="init">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <bean id="dynamicTableDao" class="org.openforis.collect.persistence.DynamicTableDao">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
</beans>

1 Ответ

2 голосов
/ 11 марта 2012

Я не уверен, что вы пытаетесь достичь, я могу только сказать, что это не типичное использование для Spring Framework.Может быть, если вы напишите, что вы хотите, можно было бы придумать лучший совет.

Ваши аннотации вообще не обрабатываются при запуске основного метода.Контекст не создается, поэтому ваш test-context.xml игнорируется.Если вы хотите построить контекст из основного метода, попробуйте:

FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("test-context.xml");

и определите MyTest как bean-компонент, чтобы увидеть внедрение surveyDao.

...