1. 程式人生 > >spring mvc 註解事務不生效

spring mvc 註解事務不生效

spring mvc註解事務配置很簡單

下面簡短的程式碼便可以解決 註解事務不生效問題。

我是 在web.xml檔案<servlet-name>指向的首先載入的spring配置檔案中加以下註解。這樣好像不夠優雅但沒嘗試更好的方法。

     <!-- (事務管理) -->           
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>  
    
   

<!--定義註解驅動的事務 告訴spring查詢上下文中所有@Transactional註解的Bean,
    而不管註解用在類級別還是方法級別上,對於每個使用@Transactional的Bean <tx:annotation-driven>
    會自動為它新增事務通知
    **proxy-target-class 若service類實現了介面,其值要為true
    **要想事務生效,必須要掃描包前定義註解驅動事務
    -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
 
    <!--自動掃描註解bean -->    
    <context:component-scan base-package="com"/>  


另外在service、controller類中都要throws Exception,例如下面

@Transactional(propagation=Propagation.REQUIRED,rollbackFor={Exception.class})
public void addSaveMoney ( BigDecimal amount,String account,DealRecord dealRecord)throws Exception{

try{
bankAccountDao.saveMoney(amount, account);
// String s = null;
// s.length();
bankAccountDao.saveOrPutMoneyLog(dealRecord);
}catch(Exception e){
throw e;
}


}


    @RequestMapping(value="/saveMoney",method= RequestMethod.POST)
    public ModelAndView saveMoney(HttpServletRequest request,Model model) throws Exception{
    String account = request.getParameter("account");
    String amountString = request.getParameter("amount");
    Long amountLong = Long.valueOf(amountString);
//     Long amountLong = Long.decode(amountString);
    BigDecimal amount = BigDecimal.valueOf(amountLong);
    Long accountid = bankAccountService.findAccountid(account);
    Timestamp dealTime = TimeStampUtil.formatTimeStamp(new Timestamp(new Date().getTime()));
    DealRecord dealRecord = new DealRecord(accountid, amount, DealWay.put, dealTime);
bankAccountService.addSaveMoney(amount, account,dealRecord);
    return new ModelAndView(new RedirectView("../security/userInfo/"+request.getParameter("name"))); 
    }