2009-04-11 36 views
2

我一直在摔跤這個問題了一段時間,並沒有看到一個解決方案。希望任何人都可以幫助我。春:沒有事務管理器已配置

我配置了一個HibernateTransactionManager。但是,我在日誌文件中看到以下消息:

DEBUG [http-8080-1] AnnotationTransactionAttributeSource.getTransactionAttribute(107)|添加事務方法[Cashin的]與屬性[PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-nl.forestfields.picnic.domain.model.exception.IllegalCostException]

DEBUG [HTTP-8080-1] AnnotationTransactionAspect.createTransactionIfNecessary(267)|跳過事務連接點[nl.forestfields.picnic.view.controller.ShoppingListController.cashIn],因爲沒有配置事務管理器

而且,如果發生異常,事務不會回滾。

這裏是我的配置:

野餐servlet.xml中:

<beans> 

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

    <tx:annotation-driven /> 
    . 
    . 
    . 

野餐上下文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> 

的代碼應該在事務內執行:

@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(...); 
} 

任何人都可以看到問題嗎?

乾杯, Jippe

回答

5

嘗試改變

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

無法在這裏找到任何其他問題。

+0

2.5年後...您的回答解決了我的問題。抱歉,我無法接受您的回答,但至少您得到了我的+1。 – Paul 2011-08-23 04:31:41

2

另外,回滾只發生unchecked異常。 如果要回滾的檢查異常,你就必須聲明它在@Transactional註釋:

@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

你說你有兩個不同的bean定義文件。這些代表兩種不同的應用程序環境,還是一個導入另一個?

春天文檔是不明確這一點,但它可能是,如果它在相同的上下文本身只會自動找到「transactionManager的」豆。如果transactionManager在父上下文中,它可能找不到它。

正如jerrish說,剛明確指定元素的事務管理器的屬性。

0

嘗試改變

`< TX:註解驅動/ >

to 

< TX:註解驅動的事務管理器= 「transactionManager的」/ >

未能進行在這裏找到任何其他問題。

這不是解決辦法,因爲彈簧單證說:

如果 的PlatformTransactionManager的bean的名稱要線,則可以省略事務管理器屬性的 標籤中有名稱 transactionManager。 Using @Transactional

有些東西必須改變了......

1

解決prolem,您必須聲明:

<tx:annotation-driven /> 

野餐上下文db.xml和不在picnic-servlet.xml

lrdblck