我正在尝试根据 Spring Boot 应用程序中的方法名称实现不同的事务语义。据我所知,我必须通过 XML 来执行此操作,如 here 所示。 。这并不理想,但还好。
我遇到的问题是匹配 BaseService 子类上的所有公共(public)方法。我已经看过完整的 AspectJ 的示例,但在 Spring aop: stuff 中它似乎不起作用。
<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 事务支持。
最佳答案
我建议您阅读 AspectJ 教程或 Spring AOP manual为了学习语法。
- 问题中切入点的问题在于您没有为要拦截的方法指定返回类型。
- 第二个问题是,现在您正在尝试匹配所有返回(!)
BaseService
实例的公共(public)方法。
你可能真正想要的是
execution(public * ppi.nestup.v3.service.BaseService+.*(..))
顺便说一句,您不需要使用 XML 配置,您可以通过 @Aspect
、@Pointcut
、@Before< 以注释样式声明方面
、@Around
等等。
关于java - Spring通过子类的方法名来声明事务语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49699815/