当前位置: 首页 > 知识库问答 >
问题:

在Tomcat中没有使用Spring配置AspectJ LTW

温成济
2023-03-14

我遵循了以下spring文档中给出的步骤:https://docs.spring.io/spring/docs/4.3.14.release/spring-framework-reference/html/aop.html#aop-aj-ltw

我的项目是一个包含模块的整体:

模块M1中的ApplicationService。父模块m1的子模块m2。(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"/>
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) {
        ...
    }
}
<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。我错过了什么?

共有1个答案

漆雕宏浚
2023-03-14

如果您希望使用AspectJ LTW而不是Spring AOP,那么就不应该使用Spring AOP配置。所以请删除 。尽管名字是关于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

最后,但并不是最不重要的,就像我在你前面的问题中已经说过的3X,请在GitHub上提供一个MCVE,然后我可以分析你的问题。我真的不能做更多的推测与你提供的信息在这里。所以请你做我让你做的,帮我帮你。多谢了。

 类似资料:
  • 我想知道,在SpringWeb应用程序中,是否有任何方法可以在没有Spring Boot的情况下使用SpringCloudConfig客户端。我想使用带有@Value注释的spring cloud config,我不喜欢在我的web应用程序中使用spring CloudServer rest api。我尝试了开发人员在spring CloudConfig Client中说的没有spring Boo

  • Spring-boot-starter-web的嵌入式Tomcat配置文件在哪里?我想设置autodeploy=“true”以使嵌入式Tomcat热部署对html文件的更改。

  • 我有几个Spring Boot应用程序的实例部署在一个独特的Tomcat中。每个应用程序都配置了一个context.xml文件,该文件包含客户代码 有什么方法可以使这个日志返回配置工作吗? 在application.properties中定义的属性的使用效果很好(我将logback.xml重命名为logback-spring.xml)。在我看来,Spring boot在初始化日志记录之前并没有在E

  • 我需要将我的Spring Boot ZuL网关中的MaxKeepAliverRequests值修改为高于默认值100的值。注意到该值未在Spring Boo的公共属性列表中公开,我尝试通过@Configuration class设置属性: 但似乎并没有起到预期的效果。有没有一种合适的方法可以让我更改没有通过Spring common properties公开的Tomcat属性?

  • 问题内容: 经过一会儿(几个小时)后,我们从DBCP获得了CommunicationsException。错误消息(位于“异常”中)在此问题的末尾- 但我看不到任何配置文件中定义的wait_timeout。(我们应该看哪里?在tomcat / conf目录之外的某个地方?)。 其次,如异常所建议,将“ Connector / J连接属性’autoReconnect = true’”放在哪里?这是在

  • 这个问题是关于Spring中的Java config。是否可以用Java代码替换下面的声明。 其中:secure-app-context.xml