2013-06-26 2 views
0

В моем приложении, у меня есть 2 TransactionManager, созданные, как это:Не удается открыть сделку Spring путем аннотирования

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <qualifier value="exec"/> 
    <property name="dataSource" ref="execDataSource"/> 
</bean> 
<bean id="txManagerAdmin" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <qualifier value="admin"/> 
    <property name="dataSource" ref="adminDataSource"/> 
</bean> 

В том же файл, у меня есть аннотации инициативы заявление:

<tx:annotation-driven transaction-manager="admin"/> 

Для того, чтобы просто удобство моего администратора TransactionManager, я создал простую аннотацию:

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Transactional(value="admin", rollbackFor=NullPointerException.class, propagation = Propagation.REQUIRES_NEW, isolation = Isolation.DEFAULT) 
public @interface AdminTx { 

} 

И здесь мой метод с аннотацией транзакции:

@AdminTx 
    @Override 
    public UaCatalogDTO addUa(UaDTO uaDTO) throws TechnicalException { 
     MapSqlParameterSource namedParameterSource = new MapSqlParameterSource(); 
     mapAllUaFields(uaDTO, namedParameterSource); 
     try { 
      jdbcTemplate.update(SqlQueries.ADD_UA, namedParameterSource); 
     } catch (DuplicateKeyException e) { 
      throw new TechnicalException(e, "ADM001"); 
     } 
       if (1==1) //due to compiler 
       throw new NullPointerException(); //to test the transaction is working 
    } 

Этот метод вызывается из другого класса благодаря интерфейсу. Компонент был добавлен Spring @Autowired аннотацией. Объект jdbcTemplate был создан с помощью этого кода:

@Autowired 
@Qualifier("adminDataSource") 
public void setDataSource(DataSource dataSource) { 
    this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); 
} 

Моя проблема когда я выполняю jdbcTemplate.update() линию, если я проверить свою базу данных, данные уже присутствуют. Кроме того, даже если я выбрал исключение NullPointerException, данные остаются в базе данных.

После некоторого поиска я обнаружил, что мы можем позвонить TransactionSynchronizationManager.isActualTransactionActive(), и он возвращает мне значение false. Итак, я понимаю, что моя аннотация ничего не делает, но я не могу понять, почему.

Я работаю на сервере Websphere, а база данных - DB2.

ответ

0

После некоторого поиска я, наконец, нашел проблему, поэтому я размещаю ее, если кому-то интересно: Это был компонент, созданный Spring, без специального объявления XML, но весеннего сканирования.

Когда я попытался объявить свой bean-компонент в файле XML, а затем ввел его в класс с Autowired и Qualifier, транзакция, наконец, откроется и закрывается.

Я не знаю причину, кстати.