2009-04-11 10 views
2

Ich habe mit diesem Problem für eine Weile gerungen, und sehe keine Lösung. Hoffe, dass mir jemand helfen kann.Spring: Kein Transaktionsmanager wurde konfiguriert

Ich habe einen HibernateTransactionManager konfiguriert. Ich sehe jedoch die folgende Nachricht in der Protokolldatei:

DEBUG [http-8080-1] AnnotationTransactionAttributeSource.getTransactionAttribute (107) | Hinzufügen Transaktionsmethode [cashin] mit dem Attribut [PROPAGATION_REQUIRED, ISOLATION_DEFAULT, -nl.forestfields.picnic.domain.model.exception.IllegalCostException]

DEBUG [http-8080-1] AnnotationTransactionAspect.createTransactionIfNecessary (267) | Transaktionaler Joinpoint [nl.forestfields.picnic.view.controller.ShoppingListController.cashIn] wird übersprungen, weil kein Transaktionsmanager konfiguriert wurde

Im Falle einer Ausnahme wird die Transaktion nicht zurückgesetzt.

Hier ist meine Konfiguration:

Picknick-servlet.xml:

<beans> 

    <context:component-scan base-package="picnic" /> 
    <context:annotation-config /> 

    <tx:annotation-driven /> 
    . 
    . 
    . 

Picknick-Kontext-db.xml:

<bean class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" id="sessionFactory"> 

    <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
     </props> 
    </property> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName"> 
     <value>${hibernate.connection.driver_class}</value> 
    </property> 
    <property name="url"> 
     <value>${hibernate.connection.url}</value> 
    </property> 
    <property name="username"> 
     <value>${hibernate.connection.username}</value> 
    </property> 
    <property name="password"> 
     <value>${hibernate.connection.password}</value> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

Der Code, der sollte innerhalb einer Transaktion ausgeführt werden:

@Transactional(rollbackFor=IllegalCostException.class) 
public ModelAndView cashIn(@RequestParam final Long id) throws IllegalCostException, llegalOrderStateException, IllegalShoppingListStateException { 

    final ShoppingList shoppingList = shoppingListRepository.getById(id); 
    shoppingList.cashIn(); 
    shoppingListRepository.add(shoppingList); 

    return new ModelAndView(...); 
} 

Kann jemand das Problem sehen?

Cheers, Jippe

Antwort

5

Try

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

anderes Problem hier nicht finden kann zu verändern.

+0

2,5 Jahre später ... Ihre Antwort löste mein Problem. Entschuldigung, ich kann deine Antwort nicht als korrekt akzeptieren, aber zumindest bekommst du +1 von mir. – Paul

2

Darüber hinaus tritt ein Rollback nur für auf. Unchecked Exceptions. Wenn Sie für geprüfte Ausnahmen rückgängig zu machen möchten, müssen Sie es in der @Transactional Anmerkung erklären müssen:

@Transactional(rollbackFor = { IllegalCostException.class, llegalOrderStateException.class }) 
public ModelAndView cashIn(@RequestParam final Long id) throws IllegalCostException, llegalOrderStateException, IllegalShoppingListStateException { 

    final ShoppingList shoppingList = shoppingListRepository.getById(id); 
    shoppingList.cashIn(); 
    shoppingListRepository.add(shoppingList); 

    return new ModelAndView(...); 
} 
0

Sie sagen, Sie haben zwei verschiedene Bean-Definitionsdateien. Stellen diese zwei unterschiedliche Anwendungskontexte dar, oder importiert der eine den anderen?

Die Spring-Dokumente sind nicht klar, aber es kann sein, dass die Bean "transactionManager" nur dann automatisch gefunden wird, wenn sie sich im selben Kontext befindet wie sie selbst. Wenn sich der transactionManager im übergeordneten Kontext befindet, wird er möglicherweise nicht gefunden.

Wie Jerrisch sagte, nur explizit das Transaktionsmanagerattribut des Elements angeben.

0

Versuchen

`< tx Wechsel: annotation-driven/>

to 

< tx: annotation-driven transaktions Manager = "transaction"/ >

konnte nicht finde hier ein anderes Problem.

Dies kann nicht die Lösung sein, da die feder Dokumentationen sagt:

Sie die Transaktion-Manager-Attribut im Tag, wenn die Bohne Namen des PlatformTransactionManager, die Sie Draht wollen weglassen in hat den Namen transactionManager. Using @Transactional

Etwas anderes geändert haben muss ...

1

die prolem zu lösen, müssen Sie erklären:

<tx:annotation-driven /> 

in Picknick-Kontext-db.xml und nicht in picknick-servlet.xml

lrdblck

Verwandte Themen