Менеджер транзакций Spring JDBC

Я пытаюсь написать диспетчер транзакций с использованием JDBC весной.

мой app-servlet.xml

<!-- JDBC Config -->
<bean   id="dataSource" 
        class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" 
        p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.databaseurl}" 
        p:username="${jdbc.username}" 
        p:password="${jdbc.password}" />

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

<bean id="UserDAOImpl" class="com.project.dao.impl.UserDAOImpl">
    <property name="transactionManager" ref="transactionManager"/>
</bean>

мой UserDAOImpl.java

public class UserDAOImpl implements UserDAO {

//transaction manager
private DataSourceTransactionManager transactionManager;
private JdbcTemplate jdbcTemplate;

public UserDAOImpl() {
    super();
    DataSource dataSource = transactionManager.getDataSource();
    jdbcTemplate = new JdbcTemplate(dataSource);
}

public void setTransactionManager(DataSourceTransactionManager transactionManager)    {
    this.transactionManager = transactionManager;
}
....
}

Несмотря на то, что в моем приложении-сервлете есть transactionManager Bean, UserDAOImpl не будет создан, потому что transactionManager это null. Возможно, я упустил какой-то момент, но не мог понять, что не так.


person gencay    schedule 03.08.2012    source источник
comment
@Kowser Вызвано: org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр класса компонента [com.project.dao.impl.UserDAOImpl]: конструктор выдал исключение; вложенным исключением является java.lang.NullPointerException ...... Вызвано: java.lang.NullPointerException в com.project.dao.impl.UserDAOImpl.‹init›(UserDAOImpl.java:29)   -  person gencay    schedule 03.08.2012


Ответы (4)


Вы должны использовать внедрение конструктора для вашего менеджера транзакций. Spring вызовет конструктор, прежде чем он сможет внедрить свойство transactionManager.

 public UserDAOImpl() 
 {
    /* Transaction Manager NOT set yet */
    DataSource dataSource = transactionManager.getDataSource();
 }

Измените его, чтобы использовать внедрение конструктора

 public UserDAOImpl(TransactionManager transactionManager) ...

Затем конфигурация

 <bean id="UserDAOImpl" class="com.project.dao.impl.UserDAOImpl">
   <constructor-arg ref="transactionManager"/>
 </bean>
person jeff    schedule 03.08.2012

Если вы используете spring с аннотациями, это должно работать

@Repository
public class UserDAOImpl implements UserDAO{

@Autowired
private DataSourceTransactionManager transactionManager;

private JdbcTemplate jdbcTemplate;

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

и вы можете покончить с этой строкой в ​​​​конфигурации

<bean id="UserDAOImpl" class="com.project.dao.impl.UserDAOImpl">
<property name="transactionManager" ref="transactionManager"/>
</bean>

вместо этого выполните сканирование компонентов:

<!-- Scans within the base package of the application for @Components to configure as beans -->
<context:component-scan base-package="${your package}" />

Подробнее об этом можно узнать в документации. Если вы не используете аннотации, измените версию выпуска в URL данной ссылки на ту, которую вы используете. У этого достаточно примеров, чтобы сделать то же самое без аннотаций.

person shazinltc    schedule 03.08.2012

У вас есть файл свойств или другие способы инициализации этих переменных?

p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.databaseurl}" 
        p:username="${jdbc.username}" 
        p:password="${jdbc.password}"

Это заполнители, и для них потребуются значения, например, по этой ссылке

Существует файл свойств с именем jdbc.properties, который определяет данные для имени класса драйвера и т. д.

Вот пример исходного кода для примера.

person sathish_at_madison    schedule 03.08.2012
comment
У меня есть файл свойств. На самом деле проблема не в этой части, а в transactionManager - person gencay; 03.08.2012

Вы также можете изменить получение jdbcTemplate:

public void setTransactionManager(DataSourceTransactionManager transactionManager)    {
  this.transactionManager = transactionManager;
  DataSource dataSource = transactionManager.getDataSource();
  jdbcTemplate = new JdbcTemplate(dataSource);
} 
person pawelccb    schedule 03.08.2012