在将此问题标记为重复之前,请仔细阅读 我已经在SO和其他地方经历过一些帖子,但有 仍未能找到解决我问题的方法。
我正在尝试在Spring + AspectJ中实现一个项目,正如标题所说,我可以看到应用建议的aspectj maven插件但实际上并没有调用它。
我正在尝试根据注释应用建议。 以下是注释类:
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
}
注释类和方面在同一个包中,而被建议的类位于不同的包中,但所有内容都在同一个项目中。
我已经配置了我的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
根据日志,找到并建议了连接点,但是在调用logBefore()
方法时从不调用create()
方法。我确信这是因为我正在使用FileWriter
写入文件,但没有写任何内容。
部署详情 该项目是作为另一个项目的一部分构建的,该项目创建了一个ear文件,然后部署在JBoss 6.3上
我尝试了很多方法但没有任何效果。请让我知道我错过了什么。
感谢任何帮助。
答案 0 :(得分:2)
我终于开始工作了。结果我太复杂了。不需要aspectj编译器。我所要做的就是告诉春天,我的方面也是一个组成部分,以便它可以注入我的建议。
所以这里是完整的变化列表:
@Component
注释我的方面类,并确保将其作为Spring组件扫描的一部分进行扫描。希望这也有助于其他人。
PS。我仍然不完全理解为什么这样做如果有人有解释,请发表评论。