標記這個問題爲重複之前,請看一遍,因爲 我已經通過了一些帖子上了SO和其他地方,但有 仍然未能找到解決辦法對我的問題。AspectJ的行家建議連接點,但建議不叫
我試圖在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();
}
該註釋已經被應用到一個正被從前端的JS腳本通過一個AJAX調用被調用的方法。被調用的方法如下:
@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
}
註釋類和方面都在同一個包而正在建議的班級採用不同的包裝,但一切都在同一個項目中。
我如下(僅示出了相關部分),被配置我的行家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>
正在使用的彈簧版本是4.1.3.RELEASE
。
我的方面Spring配置項如下:
<aop:aspectj-autoproxy />
<bean id="logAspect" class="somep2.LoggingAspect" />
在運行mvn clean install
構建成功,以下日誌條目存在WRT的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
寫入文件,但是沒有任何內容正在寫入。
部署細節: 這個項目是爲它創建,然後將其部署在JBoss 6.3
我已經試過許多方法,但沒有奏效耳朵文件的另一個項目的一部分。請讓我知道我錯過了什麼。
任何幫助表示讚賞。
您是否在您的bean配置類中添加了'@ EnableAspectJAutoProxy'註釋? –
我對春季和秋季都很新穎,所以如果我錯了,請糾正我的錯誤。這是必要的看到,因爲我已經有一個春天配置文件的方面autoproxy已經設置,我在那裏定義我的豆? –
在'process-sources'階段調用aspectj插件對我來說很奇怪,因爲它在正常編譯階段之前。默認的'maven-compiler-plugin'甚至在你的構建中被禁用了嗎?我不確定如果未禁用它會發生什麼情況,因爲那樣您將運行aspectj編譯器和普通java編譯器,java編譯器將在比調用aspectj編譯器的階段更晚的階段被調用,可能會覆蓋編譯的類由aspectj編譯創建。改變你的版本,所以你只在適當的階段使用aspectj編譯器:'compile'。 –