【问题标题】:AspectJ LTW not getting configured with Spring in TomcatAspectJ LTW 未在 Tomcat 中配置 Spring
【发布时间】:2020-01-04 12:27:02
【问题描述】:

我已按照以下春季文档中给出的步骤进行操作: https://docs.spring.io/spring/docs/4.3.14.RELEASE/spring-framework-reference/html/aop.html#aop-aj-ltw

我的项目是一个带有模块的单体:

模块 m1 中的应用程序服务。 子模块 m2 与父 m1。(m1 依赖于 m2)

m1/WebContent/META-INF/aop.xml中的aop.xml文件如下:

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">

<aspectj>    
    <weaver>
        <!-- only weave classes in our application-specific packages -->
        <include within="m2.*"/>
    </weaver>

<aspects>
    <!-- weave in just this aspect -->
    <aspect name="m2.security.FieldPermissionAspect"/>
</aspects>

m1/src/main/webapp/WEB-INF中的Application-context.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task"
xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task-3.2.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
...

<mvc:annotation-driven />
<aop:aspectj-autoproxy />
<task:annotation-driven />
<!-- this switches on the load-time weaving -->
<context:load-time-weaver weaver-class="org.springframework.instrument.classloading.tomcat.TomcatLoadTimeWeaver"/>

我在 m2.security 方面的方面如下:

package m2.security;


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;


@Aspect
@Component
public class FieldPermissionAspect {


    @Pointcut("execution(public * *(..))")
    public void combinedPointcut() {}

    @Around("combinedPointcut()")
    public void aroundMapper(ProceedingJoinPoint joinPoint) {
        ...
    }

    @Around("cflow(combinedPointcut())")
    public void aroundSetter(ProceedingJoinPoint joinPoint) {
        ...
    }
}

m2 中 pom.xml 中的 AspectJ 依赖项:

<dependencies>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.7</version>
        <scope>runtime</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.7</version>
    </dependency>

</dependencies>

当我在tomcat环境中运行时,出现如下错误:

Caused by: org.aspectj.weaver.tools.UnsupportedPointcutPrimitiveException: Pointcut expression 'cflow(combinedPointcut())' contains unsupported pointcut primitive 'cflow'
at org.aspectj.weaver.tools.PointcutParser.validateAgainstSupportedPrimitives(PointcutParser.java:425)
at org.aspectj.weaver.tools.PointcutParser.resolvePointcutExpression(PointcutParser.java:311)
at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:294)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:207)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:193)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:170)
at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:208)
at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:262)
at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:294)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:118)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:88)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:69)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:330)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:293)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1577)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
... 66 more

我认为这是因为在我的方面,spring 仍在使用 Spring AOP 而不是 AspectJ。我在这里错过了什么?

【问题讨论】:

  • 根据文档,当在切入点表达式中使用 cflow 时,Spring AOP 会抛出 IllegalArgumentException。有关 UnsupportedPointcutPrimitiveException 的详细信息,请查看此答案stackoverflow.com/a/6523083/4214241
  • @R.G 我知道这一点。这就是我尝试配置 aspectj LTW 而不是 Spring AOP 的原因。但是我仍然遇到这个错误,所以我的问题是为什么 AspectJ LTW 不能使用这些配置。
  • 尝试从 Application-context.xml 中删除 单独应该启用加载时间编织
  • 我试过了。没用。还尝试删除 classLoader weaver 类标签。那也没用。

标签: spring tomcat aop aspectj spring-aop


【解决方案1】:

如果您想使用 AspectJ LTW 而不是 Spring AOP,则不应使用 Spring AOP 配置。所以请摆脱&lt;aop:aspectj-autoproxy /&gt;。尽管它的名称是关于 Spring AOP,而不是 AspectJ。 AspectJ 不使用任何代理。

至于你的错误信息,...

Caused by: org.aspectj.weaver.tools.UnsupportedPointcutPrimitiveException:
  Pointcut expression 'cflow(combinedPointcut())'
  contains unsupported pointcut primitive 'cflow'

...它发生是因为您仍在使用 Spring AOP,未使用 AspectJ LTW。所以你有一个配置问题。如果你用

启动你的容器,它会起作用吗?
-javaagent:/path/to/aspectjweaver.jar

在 Java 命令行上?

最后但同样重要的是,就像我说的 3x 已经在您的 previous question 中,请在 GitHub 上提供 MCVE,然后我可以分析您的问题。我真的无能为力,只能根据您在这里提供的信息进行推测。所以请按照我的要求去做,并帮助我帮助你。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多