2016-09-26 75 views
1

標記這個問題爲重複之前,請看一遍,因爲 我已經通過了一些帖子上了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

我已經試過許多方法,但沒有奏效耳朵文件的另一個項目的一部分。請讓我知道我錯過了什麼。

任何幫助表示讚賞。

+0

您是否在您的bean配置類中添加了'@ EnableAspectJAutoProxy'註釋? –

+0

我對春季和秋季都很新穎,所以如果我錯了,請糾正我的錯誤。這是必要的看到,因爲我已經有一個春天配置文件的方面autoproxy已經設置,我在那裏定義我的豆? –

+0

在'process-sources'階段調用aspectj插件對我來說很奇怪,因爲它在正常編譯階段之前。默認的'maven-compiler-plugin'甚至在你的構建中被禁用了嗎?我不確定如果未禁用它會發生什麼情況,因爲那樣您將運行aspectj編譯器和普通java編譯器,java編譯器將在比調用aspectj編譯器的階段更晚的階段被調用,可能會覆蓋編譯的類由aspectj編譯創建。改變你的版本,所以你只在適當的階段使用aspectj編譯器:'compile'。 –

回答

1

我終於得到它的工作。事實證明我太複雜了。沒有必要使用aspectj編譯器。我所要做的就是告訴春天,我的方面也是一個組成部分,所以它可以注入我的建議。

所以這裏的變化的完整列表:

  1. 刪除從pom.xml中AspectJ的Maven的插件。這不是必需的。
  2. 刪除了aspectj-tools和spring-aop依賴項,並添加了aspectj-weaver依賴項到pom.xml
  3. 從spring配置中刪除了我的方面的bean條目。
  4. @Component註釋我的方面類,並確保它是作爲Spring組件掃描的一部分進行掃描的。

希望這可以幫助別人。

PS。我仍然不完全明白爲什麼這會起作用,所以如果有人有解釋,請評論。