Калитка с пружиной декларативная сделка - PullRequest
0 голосов
/ 13 января 2010

Можно использовать поддержку @Transactional в Spring Framework вне контейнера Spring. В справочной документации есть глава об аспекте AspectJ. Я пытаюсь использовать его в своем приложении для калитки, но без положительного результата.

Приложение-context.xml:

<tx:annotation-driven transaction-manager="transactionManager" mode="aspectj" />
<context:annotation-config />
<context:component-scan base-package="com.wicket.app"/>
<context:spring-configured />

<bean id="annotationTransactionAspect" factory-method="aspectOf"
      class="org.springframework.transaction.aspectj.AnnotationTransactionAspect">
    <property name="transactionManager" ref="transactionManager"></property>
</bean>

В моем классе формы, аннотированном @Configurable, у меня есть:

@Transactional
public void process(IFormSubmittingComponent submittingComponent) {
    super.process(submittingComponent);
    getDao().getEntityManager().flush();
}

Трассировка стека:

org.apache.openjpa.persistence.TransactionRequiredException: Can only perform operation while a transaction is active.

Ответы [ 2 ]

4 голосов
/ 13 января 2010

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

Если вам нужны декларативные транзакции, то я предлагаю вам переместить транзакционную логику из компонента wicket в bean-компонент Spring и вызвать bean-компонент Spring из объекта wicket. Компонент Spring будет иметь аннотации транзакций и будет правильно проксирован контейнером Spring.

0 голосов
/ 13 января 2010

У меня нет опыта работы с Wicket. Но является ли ваш «класс формы» (тот, который содержит метод, отмеченный @Transactional) управляемым кодом Spring? т.е. кто создает экземпляры класса?

Если это не так, то Spring не будет поддерживать @Transactional (не будет работать @Autowired и т. Д.).

...