2014-04-04 23 views
1

我爲我的應用程序使用Roo和編譯時編織。一個袋鼠已生成的類是我UserIntegrationTest爲什麼我的切入點不建議在另一個方面聲明的方法?

@RooIntegrationTest(entity = User.class) 
@WebAppConfiguration 
@ActiveProfiles("test") 
@DirtiesContext 
@RequiredUserDetails(roles=Role.ROOT) 
public class UserIntegrationTest { 
    @Test 
    public void myTestMethod(){ 

    } 
} 

大部分的代碼都是在袋鼠產生ITD:

privileged aspect UserIntegrationTest_Roo_IntegrationTest { 

    declare @type: UserIntegrationTest: @RunWith(SpringJUnit4ClassRunner.class); 

    declare @type: UserIntegrationTest: @ContextConfiguration(locations = "classpath*:/META-INF/spring/applicationContext*.xml"); 

    declare @type: UserIntegrationTest: @Transactional; 

    @Autowired 
    UserDataOnDemand UserIntegrationTest.dod; 

    @Autowired 
    UserService UserIntegrationTest.userService; 

    @Autowired 
    UserRepository UserIntegrationTest.userRepository; 

    @Test 
    public void UserIntegrationTest.testCountAllUsers() { 
     Assert.assertNotNull("Data on demand for 'User' failed to initialize correctly", dod.getRandomUser()); 
     long count = userService.countAllUsers(); 
     Assert.assertTrue("Counter for 'User' incorrectly reported there were no entries", count > 0); 
    } 

    ... 
    ... 
    ... 

} 

我寫我自己的方式來處理我的@RequiredUserDetails註釋。我的切入點指定了用@RequiredUserDetails註解的類中的任何@Test方法。儘管切入點對於主類中聲明的任何方法都可以正常工作(即:MyTestMethod()),但它不會採用ITD中的任何方法。

@Aspect 
public class RequiredUserDetailsAspect { 
    /** 
    * Defines any public <code>@Test</code> method 
    */ 
    @Pointcut("execution(public * *(..)) && @annotation(org.junit.Test)") 
    public void testMethod() {}; 

    /** 
    * Anything with the {@link RequiredUserDetails} annotation on the method 
    */ 
    @Pointcut("@annotation(RequiredUserDetails)") 
    public void annotatedMethod(){}; 

    /** 
    * Anything with the {@link RequiredUserDetails} annotation on the class 
    */ 
    @Pointcut("@within(RequiredUserDetails)") 
    public void annotatedClass(){}; 


    @Before("testMethod() && (annotatedClass() || annotatedMethod())") 
    public void authenticateUser(JoinPoint jp){ 
     // check for any class annotations 
     } 
} 

我會預料到,鑑於Roo ITD正在CTW,我的方面也適用於這些方法。我假定我的方面是在Roo方面編織的,因此Roo的ITD並不是我班的一部分。

是否有辦法確保Roo的ITD在我自己的方面之前編織或確保我的切入點適用於Roo ITD?

我嘗試添加@DeclarePrecedence的方面的頂部,但是要麼沒有工作,我希望,或者我把它錯誤地定義,因爲它已經沒有區別。

@Aspect 
@DeclarePrecedence("**.*Roo*, RequiredUserDetailsAspect") 
public class RequiredUserDetailsAspect { 
    ... 
    ... 
} 

回答

0

AspectJ documentation

AspectJ 5中允許的方面和它們的成員使用任一代碼風格或註釋風格被指定。無論您使用哪種風格,AspectJ weaver都可確保您的程序具有完全相同的語義 。這是引用一個着名的廣告活動,「一個 的選擇,而不是妥協」。這兩種風格可以在一個 應用程序中混合使用,即使在單個源文件中也是如此,儘管我們懷疑 後者的這種混合將在實踐中推薦使用。

閱讀它我認爲不是關於混合切入點樣式的問題,但我認爲值得嘗試將此方面改爲代碼樣式而不是註釋方式。

要嘗試的其他事情是更改RequiredUserDetailsAspect的包位置。這包括進入src/main/java改爲src/test/java(當聲明的優先級爲時,我可以記住Roo上測試文件夾的雙波形問題)。

祝你好運!

相關問題