2015-05-27 2 views
1

У меня возникла проблема при вызове метода службы, написанного в Spring Sevice, который был введен в MVVM в этом методе. Я сохраняю один объект, а после этого выполняю другой метод вызова метода оценки, который вызывает исключение и я хочу, чтобы в то время как бросать это исключение моя сделка откатить мой метод обслуживания части как под 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) 

боб вводит

@WireVariable(ICeilingSheetService.NAME) private ICeilingSheetService ceilingSheetService; 

Когда я попробовал этот метод для вызова из тестового JUnit случае отбрасывания хорошо, но когда я интегрировать его с ZK zul и View Model авторизованными службами, она перестает откатываться назад, и даже если мой код вызывает 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, я предполагаю, что у вас есть new CeilingServiceIMPL() где-то в коде ZK, потому что вы не могли понять, как вставлять весенние бобы в контроллер. Это эффективно делает все @Transactional бесполезным.

Вы должны получить фасоль с весны. Отъезд http://www.zkoss.org/product/zkspring и документацию по телефону Using Spring Variable Resolver, как подключить бобы с ZK.

+0

Спасибо Aaron за ответ, я закачиваю beans-сервис в ZK-контроллер с помощью ZK Auto-wired Annotation. Код отключен для контроллера для автоматической проводки весны: @WireVariable (ICeilingSheetService.NAME) частный ICeilingSheetService ceilingSheetService; Это приведет к подключению моего компонента bean-сервиса в контроллере ZK и отлично работает для всех видов активности, кроме откат во время исключения. – vikas

+0

Тогда что вы видите в журнале отладки? –

+0

Было бы неплохо добавить код инъекции и определение компонента в вопрос. –

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 сессии начинается, что собирались откатить и поскольку это новая сделка поэтому он ничего не нашел для отката.

Как только я удалил другой менеджер транзакций, он начнет работать. Спасибо всем за поддержку ...

Смежные вопросы