2015-05-27 18 views
1

我面临一个问题,同时调用在MVVM中注入的Spring服务中写入的服务方法,我保存一个对象,然后做一些其他值抛出方法调用,抛出异常我想,虽然抛出该异常我的事务回滚我的服务方法的一部分是为CeilingServiceIMPL下:不回滚春季交易从ZK

CeilingSheet ceilingSheet = new CeilingSheet(); 
    ceilingSheet.setFiscalYear(fiscalYear); 
    ceilingSheet.setStatus(ECeilingSheetStatus.NEW); 
    ceilingSheet = saveCeilingSheet(ceilingSheet).getResult(); 

    CeilingCategory ceilingCategory1 = null; 
    try { 
     ceilingCategory1 = categoryQueryService.findCeilingCategoryByCode(
       "01").getResult(); 
    } catch (ObjectNotFoundException ex) { 
     throw new RequestException(1234, ceilingCategory1); 
    } 

如果RequestException抛出,我期待我的纪录,我得救以前也回滚。我已经被注释为

@Transactional(rollbackFor = RequestException.class) 

这个bean被注入

@WireVariable(ICeilingSheetService.NAME) private ICeilingSheetService ceilingSheetService; 

当这个方法我试过从JUnit测试案例称之为回滚精细制作服务交易,但是当我与整合呢ZK zul页面和View Model by autowired services会停止回滚,即使我的代码抛出RequestException,我的CeilingSheet仍然存在。 我ZK的web.xml是

我的应用程序的context.xml

<bean 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>/WEB-INF/database.properties</value> 
      <value>/WEB-INF/msg-database.properties</value> 
     </list> 
    </property> 
</bean> 

<tx:annotation-driven /> 

<context:annotation-config /> 


<context:component-scan base-package="my.service" /> 

<import resource="hibernate-context.xml" /> 

我hibernat-context.xml的

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
    <property name="driverClass"> 
     <value>${jdbc.driverClassName}</value> 
    </property> 
    <property name="jdbcUrl"> 
     <value>${jdbc.url}</value> 
    </property> 
    <property name="user"> 
     <value>${jdbc.username}</value> 
    </property> 
    <property name="password"> 
     <value>${jdbc.password}</value> 
    </property> 
    <property name="maxPoolSize" value="${jdbc.maxPoolSize}" /> 
    <property name="minPoolSize" value="${jdbc.minPoolSize}" /> 
    <property name="maxStatements" value="${jdbc.maxStatements}" /> 
    <property name="testConnectionOnCheckout" value="${jdbc.testConnection}" /> 
</bean> 

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

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan"> 
     <list> 
      <value>my.domain.class</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
      <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> 
      <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
      <prop key="jadira.usertype.autoRegisterUserTypes">${jadira.usertype}</prop> 
     </props> 
    </property> 
</bean> 
<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

<bean id="persistenceExceptionTranslationPostProcessor" 
    class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> 

请咨询......

回答

0

第一步在这种情况下总是能够在DEBUG级别日志记录org.springframework.orm.hibernate4.HibernateTransactionManager。这会告诉你春天在做什么,为什么。

例如,它会告诉你它什么时候检测到异常,以及它何时执行回滚或提交。您也可以在此代码中设置断点以查看正在发生的事情。这非常简单。

对ZK有点了解,我的猜测是你在ZK代码的某个地方有new CeilingServiceIMPL(),因为你无法弄清楚如何将Spring bean注入控制器。这有效地呈现所有@Transactional无用。

你必须从春天得到豆。请查看http://www.zkoss.org/product/zkspring以及Using Spring Variable Resolver如何用ZK连接豆类的文档。

+0

感谢亚伦的回应,我在ZK控制器注入豆类服务使用ZK自动连线注释。 控制器为自动布线弹簧服务剪下的代码: @WireVariable(ICeilingSheetService.NAME) private ICeilingSheetService ceilingSheetService; 这将在ZK控制器中连接我的bean服务,并且对于除了异常之外的所有活动都可以正常工作。 – vikas

+0

那么你在调试日志中看到了什么? –

+0

将注入代码和bean定义添加到问题中会很好。 –

0

我找到了解决办法: 原因:在我的应用程序,我们必须表现出基于异常抛出的数量用户信息的要求,为此,我们有一个单独的消息休眠-context.xml中配有独立

文件
<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="messageSessionFactory" /> 
</bean> 

,一个是已经与休眠-context.xml的

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

和上面从我的应用上下文称为两个XML文件。XML作为

<import resource="hibernate-context.xml" /> 
<import resource="message-hibernate-context.xml" /> 

所以抛出后基于关键代码抛出的异常,我的用户消息豆试图加载单独的事务管理器,并致力于旧的事务,并且将要回退新的Hibernate Session启动,因为这是新的交易所以它没有发现任何回滚。

一旦我删除了其他事务管理器,它开始工作。 谢谢所有支持...