aspectj maven joinpoint 建议但不调用建议
aspectj maven joinpoint advised but advice not called
Before marking this question as a duplicate, please read through, as
I've gone through a number of posts on SO and other places but have
still failed to find a solution to my problem.
我正在尝试在 Spring + AspectJ 中实现一个项目,正如标题所说,我可以看到 aspectj maven 插件应用了建议,但它实际上并没有被调用。
我正在尝试应用基于注释的建议。
以下是注解class:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface LogThis {
String name();
int id();
int eventID();
}
此注释已应用于通过 ajax 调用从前端的 js 脚本调用的方法。被调用的方法如下:
@RequestMapping(value = "/handle", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.NO_CONTENT)
@LogThis(name = "name", ID = 12345, eventID = 12345)
public void create(@RequestBody TodoDTO todo, HttpServletRequest req) {
//perform some action
}
正在将建议应用于 LogThis
注释,建议如下:
@Pointcut("@annotation(LogThis)")
public void genericPointcut() {
}
@Pointcut("execution(* *(..))")
public void atExecution() {
}
@Async
@Before("genericPointcut() && atExecution()")
public void logBefore(JoinPoint joinPoint) throws NoSuchMethodException, SecurityException {
// Perform logging
}
注释 class 和方面在同一个包中,而建议的 class 在不同的包中,但所有内容都在同一个项目中。
我已按如下方式配置我的 maven pom.xml 文件(仅显示相关部分):
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.8</version>
<configuration>
<showWeaveInfo>true</showWeaveInfo>
<source>${java.source-target.version}</source>
<target>${java.source-target.version}</target>
<Xlint>ignore</Xlint>
<complianceLevel>${java.source-target.version}</complianceLevel>
<encoding>${project.build.sourceEncoding}</encoding>
<verbose>true</verbose>
</configuration>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
属性为:
<properties>
<sonar.language>java</sonar.language>
<java.source-target.version>1.7</java.source-target.version>
<aspectj.version>1.8.7</aspectj.version>
</properties>
aspectj 依赖项是:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
Spring 正在使用的版本是 4.1.3.RELEASE
.
我的方面的 spring 配置条目如下:
<aop:aspectj-autoproxy />
<bean id="logAspect" class="somep2.LoggingAspect" />
在 运行 mvn clean install
上构建成功并且存在以下日志条目 w.r.t aspectj:
[INFO] --- aspectj-maven-plugin:1.8:compile (default) @ myproj ---
[INFO] Showing AJC message detail for messages of types: [error, warning, fail]
[INFO] Join point 'method-execution(void somep.SomeC.create(param1, param2))' in Type 'somep.SomeC' (SomeC.java:63) advised by before advice from 'somep2.LoggingAspect' (LoggingAspect.java:36)
[INFO]
[INFO] --- aspectj-maven-plugin:1.8:test-compile (default) @ myproj ---
[WARNING] No sources found skipping aspectJ compile
根据日志,已找到并建议连接点,但在调用 create()
方法时从未调用 logBefore()
方法。我确信这一点,因为我正在使用 FileWriter
写入文件,但没有写入任何内容。
部署详细信息:
这个项目是作为另一个项目的一部分构建的,该项目创建了一个 ear 文件,然后部署在 JBoss 6.3
我尝试了很多方法,但没有任何效果。请让我知道我缺少什么。
感谢任何帮助。
我终于让它工作了。原来我把事情复杂化了太多。不需要 aspectj 编译器。我所要做的就是告诉 spring 我的方面也是一个组件,以便它可以注入我的建议。
下面是完整的更改列表:
- 从 pom.xml 中删除了 aspectj-maven-plugin。不需要。
- 删除了 aspectj-tools 和 spring-aop 依赖项并将 aspectj-weaver 依赖项添加到 pom.xml
- 从 spring 配置中删除了我方面的 bean 条目。
- 用
@Component
注释了我的方面 class 并确保它作为 Spring 组件扫描的一部分被扫描。
希望这对其他人也有帮助。
PS。我仍然不完全明白为什么会这样,所以如果有人有解释,请发表评论。
Before marking this question as a duplicate, please read through, as I've gone through a number of posts on SO and other places but have still failed to find a solution to my problem.
我正在尝试在 Spring + AspectJ 中实现一个项目,正如标题所说,我可以看到 aspectj maven 插件应用了建议,但它实际上并没有被调用。
我正在尝试应用基于注释的建议。 以下是注解class:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface LogThis {
String name();
int id();
int eventID();
}
此注释已应用于通过 ajax 调用从前端的 js 脚本调用的方法。被调用的方法如下:
@RequestMapping(value = "/handle", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.NO_CONTENT)
@LogThis(name = "name", ID = 12345, eventID = 12345)
public void create(@RequestBody TodoDTO todo, HttpServletRequest req) {
//perform some action
}
正在将建议应用于 LogThis
注释,建议如下:
@Pointcut("@annotation(LogThis)")
public void genericPointcut() {
}
@Pointcut("execution(* *(..))")
public void atExecution() {
}
@Async
@Before("genericPointcut() && atExecution()")
public void logBefore(JoinPoint joinPoint) throws NoSuchMethodException, SecurityException {
// Perform logging
}
注释 class 和方面在同一个包中,而建议的 class 在不同的包中,但所有内容都在同一个项目中。
我已按如下方式配置我的 maven pom.xml 文件(仅显示相关部分):
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.8</version>
<configuration>
<showWeaveInfo>true</showWeaveInfo>
<source>${java.source-target.version}</source>
<target>${java.source-target.version}</target>
<Xlint>ignore</Xlint>
<complianceLevel>${java.source-target.version}</complianceLevel>
<encoding>${project.build.sourceEncoding}</encoding>
<verbose>true</verbose>
</configuration>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
属性为:
<properties>
<sonar.language>java</sonar.language>
<java.source-target.version>1.7</java.source-target.version>
<aspectj.version>1.8.7</aspectj.version>
</properties>
aspectj 依赖项是:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
Spring 正在使用的版本是 4.1.3.RELEASE
.
我的方面的 spring 配置条目如下:
<aop:aspectj-autoproxy />
<bean id="logAspect" class="somep2.LoggingAspect" />
在 运行 mvn clean install
上构建成功并且存在以下日志条目 w.r.t aspectj:
[INFO] --- aspectj-maven-plugin:1.8:compile (default) @ myproj ---
[INFO] Showing AJC message detail for messages of types: [error, warning, fail]
[INFO] Join point 'method-execution(void somep.SomeC.create(param1, param2))' in Type 'somep.SomeC' (SomeC.java:63) advised by before advice from 'somep2.LoggingAspect' (LoggingAspect.java:36)
[INFO]
[INFO] --- aspectj-maven-plugin:1.8:test-compile (default) @ myproj ---
[WARNING] No sources found skipping aspectJ compile
根据日志,已找到并建议连接点,但在调用 create()
方法时从未调用 logBefore()
方法。我确信这一点,因为我正在使用 FileWriter
写入文件,但没有写入任何内容。
部署详细信息: 这个项目是作为另一个项目的一部分构建的,该项目创建了一个 ear 文件,然后部署在 JBoss 6.3
我尝试了很多方法,但没有任何效果。请让我知道我缺少什么。
感谢任何帮助。
我终于让它工作了。原来我把事情复杂化了太多。不需要 aspectj 编译器。我所要做的就是告诉 spring 我的方面也是一个组件,以便它可以注入我的建议。
下面是完整的更改列表:
- 从 pom.xml 中删除了 aspectj-maven-plugin。不需要。
- 删除了 aspectj-tools 和 spring-aop 依赖项并将 aspectj-weaver 依赖项添加到 pom.xml
- 从 spring 配置中删除了我方面的 bean 条目。
- 用
@Component
注释了我的方面 class 并确保它作为 Spring 组件扫描的一部分被扫描。
希望这对其他人也有帮助。
PS。我仍然不完全明白为什么会这样,所以如果有人有解释,请发表评论。