У меня есть требование регистрировать бизнес-операции, которые также могут быть сопоставлены с сгенерированными данными контрольного журнала.Я использую Hibernate envers в качестве механизма контрольного журнала.
Я реализовал журнал операций следующим образом:
- У меня есть классы обслуживания, которые проксируются с использованием конкретных классов (с использованием CGLIB) и расширяются.TransactionProxyFactoryBean.Это то, что обеспечивает аспект транзакции.
- Мой метод либо имеет базовый объект, переносящий данные активности в качестве типа возврата или аргумента службы.
- Предполагается, что при применении предварительного-интерцептор на TransactionProxyFactoryBean ;его AfterReturningAdvice метод должен быть вызван после завершения транзакции.
Согласно моему пониманию, пре- и пост-перехватчики для TransactionProxyFactoryBean должны вести себя следующим образом на основепри допущении, что перехватчики добавляются в стек.
- Предварительные перехватчики перед выполнением метода рекомендации
- Spring запускает транзакцию
- Пост-перехватчики передвыполняется метод рекомендации
- основной метод обслуживания выполняется
- после перехватчиков после возврата метод рекомендации запускается
- Spring фиксирует транзакцию
- предварительные перехватчики послеметод возврата рекомендаций запускается
Однако, когда я отладил приложение, я обнаружил, что метод пре-перехватчика после возврата рекомендаций запускается до совершения транзакции .
Может кто-нибудь подсказать, что я делаю не так?
Конфигурация TransactionProxyFactoryBeanuration
<bean id="fqngTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="fqngTxProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref local="fqngTransactionManager"/></property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="process*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="activityLogInterceptor"
class="com.fuelquest.mothra.activitylogs.interceptors.ActivityLogInterceptor">
<property name="activityLogPostingService">
<ref bean="activityLogPostingService" />
</property>
<property name="methodList">
<list>
<value>save*</value>
<value>execute*</value>
<value>calculate*</value>
</list>
</property>
</bean>
Файл перехватчика активности Java Определение
public class ActivityLogInterceptor implements AfterReturningAdvice {
private static final Logger logger = Logger
.getLogger(ActivityLogInterceptor.class);
private ActivityLogPostingService activityLogPostingService;
private List<String> methodList;
@SuppressWarnings("rawtypes")
@Override
public void afterReturning(Object returnValue, Method method,
Object[] methodParams, Object target) throws Throwable {
// If return type is ActivityLoggingBaseVO
if (isLoggedMethod(method.getName())) {
.......................
Конфигурация службы
<bean id="inventoryControlRuleService" parent="fqngTxProxyTemplate">
<property name="target">
<bean
class="com.fuelquest.mothra.inventorycontrol.service.impl.InventoryControlRuleServiceImpl">
<property name="assetService">
<ref bean="assetService" />
</property>
<property name="pointOfSaleService">
<ref bean="pointOfSaleService" />
</property>
<property name="inventoryService">
<ref bean="inventoryService" />
</property>
<property name="deliveryService">
<ref bean="deliveryService" />
</property>
<property name="languageCdDao">
<ref bean="languageCdDao" />
</property>
<property name="inventoryBizRulesDao">
<ref bean="inventoryBizRulesDao" />
</property>
<property name="bizRulesResultsDao">
<ref bean="bizRulesResultsDao" />
</property>
<property name="ruleEngineService">
<ref bean="ruleEngineService" />
</property>
<property name="icRuleCalculationDataDao">
<ref bean="icRuleCalculationDataDao" />
</property>
<property name="inventoryControlService">
<ref bean="inventoryControlService" />
</property>
<property name="fqngESBMessagePoster">
<ref bean="fqngESBMessagePoster" />
</property>
<property name="droolsRuleTemplateService">
<ref bean="droolsRuleTemplateService" />
</property>
<property name="uomsDao">
<ref bean="uomDao" />
</property>
</bean>
</property>
<property name="transactionAttributes">
<props>
<prop key="calculate*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="execute*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="f*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*">PROPAGATION_SUPPORTS</prop>
</props>
</property>
<property name="preInterceptors">
<list>
<ref bean="activityLogInterceptor"/>
</list>
</property>
</bean>