【问题标题】:Spring AOP. Advice in one transaction with target弹簧 AOP。在与目标的一项交易中提供建议
【发布时间】:2015-10-08 14:39:16
【问题描述】:

我有春天方面

@Aspect
@Component
public class SomeAspect

使用@Around 建议服务方法

@Around("execution(* some.pack.SomeService.someMethod(..))")
    public Object triggerSome(ProceedingJoinPoint pjp) throws Throwable {
        //pre-processing
        Object res = pjp.proceed();
        additionalService.additionalAction();
        return res;
    }

所有方法(SomeService.someMethod 和 AdditionalService.additionalAction)都是@Transactional 方法。我搜索了一种解决方案以在一个事务中执行此方法。当 [additionalAction] 方法失败时,必须回滚由 [someMethod] 添加的更改。

将@Transactional 注解添加到advice 方法不起作用。使用 @Order 注释来配置事务管理器和方面并不能满足我的需要。

是否可以在一个事务中调用此方法?

【问题讨论】:

    标签: java spring transactions aspectj spring-aop


    【解决方案1】:

    在您的服务上添加第三个方法并将其标记为@Transactional

    @Transactional
    Object thirdMethod(){
       Object res = pjp.proceed();
       additionalService.additionalAction();
       return res;
    }
    

    并从你的方面调用它:

        @Around("execution(* some.pack.SomeService.someMethod(..))")
        public Object triggerSome(ProceedingJoinPoint pjp) throws Throwable {
            //pre-processing
            return thirdMethod();
        }
    

    【讨论】:

    • 并通过第三个方法参数传递ProceedingJoinPoint?是的,我想过,但希望有更灵活的解决方案)谢谢你的回答。
    • @medvedmike 最方便的方法是将事务方法保留在服务中。没有比这更方便的方法了。
    • 好的,我会接受的。谢谢。
    • 对象 res = pjp.proceed();整数 1=1/0;附加服务.additionalAction();我尝试在中间添加 1/0,但它不是事务性的
    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多