Spring子声明事务语义由子类的方法名称

时间:2018-04-06 19:28:23

标签: java spring spring-boot spring-aop

我试图在Spring Boot应用程序中基于方法名实现不同的事务语义。据我所知,我必须通过XML显示here。这不太理想,但很好。

我遇到的问题是匹配我的BaseService的子类上的所有公共方法。我已经在完整的AspectJ中看到了这个例子,但是在Spring aop中:它似乎无法工作。

<aop:config>
    <aop:pointcut id="services" expression="execution(public ppi.nestup.v3.service.BaseService+.*(..))"/>

    <aop:advisor advice-ref="txAdvice" pointcut-ref="services"/>
</aop:config>

它不像aop:pointcut表达式。错误是

java.lang.IllegalArgumentException: Pointcut is not well-formed: expecting 'name pattern' at character position 51 
execution(public ppi.nestup.v3.service.BaseService+.*(..)

如果通过注释或Java配置实现这一目标会更好,但我不确定如何通过AspectJ切入点连接Spring事务支持。

2 个答案:

答案 0 :(得分:1)

我建议您阅读AspectJ教程或Spring AOP manual以了解语法。

  • 问题中切入点的问题在于您没有为要拦截的方法指定返回类型。
  • 第二个问题是,现在您正在尝试匹配返回(!)BaseService实例的所有公共方法。

你真正想要的是

execution(public * ppi.nestup.v3.service.BaseService+.*(..))

顺便说一句,您不需要使用XML配置,您可以通过@Aspect@Pointcut@Before@Around左右以注释样式声明您的方面,太

答案 1 :(得分:0)

这是一个错字。应该是:

<aop:pointcut id="services" expression="execution(public ppi.nestup.v3.service.BaseService+ *(..))"/>

但它似乎仍然没有匹配任何方法