Весенний jdbctemplate

Я новичок в Spring MVC и JDBCTemplate, и мне очень нужна помощь в этом. Я объявил следующее в applicationContext.xml:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://" />
    <property name="username" value="user" />
    <property name="password" value="pwd" />
</bean>

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

В моем классе DAOImpl у меня есть следующий код:

@Repository
public class ABCDAOImpl implements ABCDAO
{

    private String INSERT_SQL = null;
    private JdbcTemplate jdbcTemplate;

    @Autowired
    public void setDataSource(DataSource dataSource)
    {
        this.jdbcTemplate = new JdbcTemplate( dataSource );
    }

    @Override
    public boolean insertDataInDataBase(final Object obj)
    {
        boolean insertSuccessful = false;

        INSERT_SQL = "INSERT INTO XXX " +
                "(AA, BB, CC, DD, EE, " +
                "FF, GG, HH, II) VALUES (?,?,?,?,?,?,?,?,?)";

    KeyHolder keyHolder = new GeneratedKeyHolder();
    jdbcTemplate.update(new PreparedStatementCreator() 
            {public PreparedStatement createPreparedStatement(Connection connection) 
                           throws SQLException
                {
                  PreparedStatement ps = null;
                  ps = connection.prepareStatement(INSERT_SQL);
                  ps.setString(1, xx);
                  ps.setString(2, xx);
                  ps.setString(3, xx);
                      ps.setString(4, xx);
                  ps.setString(5, xx);
                  ps.setString(6, xx;
                  ps.setString(7, xx);
                  ps.setString(8, xx);
                  ps.setString(9, xx);
                  return ps;
                  }}, keyHolder);

        return insertSuccessful;    
    }
}

Тестовый класс:

  import static org.junit.Assert.assertTrue;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath:applicationContext.xml"})
    public class ABCDAOImplTest
    {
    private Object object = new Object();
    private ABCDAOImpl abcDAOImpl;

    @Before
    public void setup()
    {
        object.setAllVaribles();
        abcDAOImpl = new ABCDAOImpl();
    }

    @Test
    public void testRepositoryInsert()
    {
        System.out.println(abcDAOImpl.insertDataInDataBase(object));
        assertTrue(abcDAOImpl.insertDataInDataBase(object));
    }

}

Затем я использую jdbcTemplate для выполнения оператора вставки с помощью PreparedStatementCreator.
Теперь я пытаюсь проверить (без насмешек, я жестко запрограммировал значения только для проверки...), работает ли этот код или нет? Когда я запускаю этот тест, он дает мне NPE, говорящий, что jdbcTemplate равен нулю. Что-то не так с моим кодом или что-то с тем, как я его тестирую? Любая помощь будет принята с благодарностью.

С новым годом :)

PS. Я аннотировал класс Test с помощью @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:applicationContext.xml"}) только после комментария от @Pradeep. И теперь я получаю другое исключение: «Не удалось загрузить ApplicationContext».


person user123    schedule 01.01.2013    source источник
comment
Ваш DAOImpl класс покрыт component-scan?   -  person Reimeus    schedule 01.01.2013
comment
Да это так. ‹context:component-scan base-package=com.abc.def.xxx.packageName /›   -  person user123    schedule 01.01.2013
comment
1. попробуйте ‹context:component-scan base-package=com.abc.def.xxx.* /› 2. попробуйте внедрить на основе переменной экземпляра jdbcTemplate, а не в сеттере   -  person Sanath    schedule 01.01.2013
comment
Используйте @Repository в DAOImpl.java   -  person swamy    schedule 01.01.2013
comment
@swamy Я сделал это.   -  person user123    schedule 01.01.2013
comment
@Gavrav..... Мое сильное предположение заключается в том, что проблема заключается в методе тестового класса setup. Вы создаете новый объект для ABCDAOImpl. Но когда вы запускаете контейнер Spring на сервере, уже создаете объект для ABCDAO. Так что просто поставьте @Autowired ABCDAOImpl вместо создания с новым ключевым словом и попробуйте.   -  person SRy    schedule 02.01.2013
comment
Вы можете поделиться всем applicationContext.xml файлом? У вас есть путь сканирования компонентов в конфигурации?   -  person Arun P Johny    schedule 02.01.2013


Ответы (2)


Наиболее очевидный ответ заключается в том, что ваш тест не вызвал метод setDataSource() и не сделал ничего другого, что привело бы к созданию JdbcTemplate. Однако вы не показали достаточно кода, чтобы кто-то указал, в чем проблема.

Обновление: в тесте вы говорите abcDAOImpl = new ABCDAOImpl(); и все. Как вы ожидаете, что JdbcTemplate/DataSource будет введен? Это не произойдет по волшебству. Либо вам нужно закончить все это вручную, либо позволить Spring внедрить DAO в ваш тест. Для этого просто добавьте такое поле:

@Autowired
private ABCDAO abcDao;
person Ryan Stewart    schedule 01.01.2013
comment
К сожалению, ваш код довольно нечитаем. Отформатируйте его правильно с помощью IDE, затем вставьте его в свой вопрос, выберите все это и нажмите кнопку кода в редакторе, чтобы сделать его полезным. - person Ryan Stewart; 01.01.2013
comment
Похоже, ваша первоначальная проблема заключалась в том, что вы даже не запускали Spring для своего теста, но ожидали, что он будет автоматически подключаться к вам. Теперь вы пытаетесь запустить его, но у вас возникла другая проблема с конфигурацией. - person Ryan Stewart; 01.01.2013
comment
да ты прав. Я пытался использовать кнопку кода. Пожалуйста, дайте мне знать, если я могу что-то еще. - person user123; 02.01.2013
comment
Да, так намного лучше. Обновил мой ответ. - person Ryan Stewart; 02.01.2013
comment
Спасибо Райану и всем остальным за помощь. - person user123; 03.01.2013

Возможно, у вас отсутствует импорт файла applicationContext.xml в файл test-applicationContext.xml

<import resource="classpath:applicationContext.xml" />
person NPKR    schedule 01.01.2013
comment
Спасибо за ответ, с вашей помощью я продвинулся дальше. Я не создавал отдельный test-applicationContext.xml, просто аннотировал свой тестовый класс с помощью applicationContext (весь код я разместил в сообщении). Я аннотировал свой класс с помощью @RunWith(SpringJunit4Runner.class) и @ContextConfiguration(locations = {classpath:applicationContext.xml}). Теперь, когда я запускаю тест JUnit, он говорит, что не удалось загрузить контекст приложения. - person user123; 01.01.2013
comment
Тестовый класс не может найти файл applicationContext. - person NPKR; 02.01.2013