2012-11-13 3 views
1

다음과 같은 클래스가 있습니다 (Spring Roo DataOnDemand). 유닛 테스트에 사용하기 위해 새 임시 항목 (지속되지 않음)을 반환합니다. 이것은 Spring Roo의 ITD에서 push-in을 한 후에 코드가 어떻게 생겼는지를 보여줍니다. 내가해야 할 일은AspectJ를 사용하여 반환 된 객체의 속성을 수정하는 방법은 무엇입니까?

public class MyObjectOnDemand { 
    public MyObjectOnDemand getNewTransientObject(int index) { 
     MyObjectOnDemand obj = new MyObjectOnDemand(); 
     return obj; 
    } 
} 

봄 루의 자동 생성 방법의 치료를 참가하는 추가 필드를 설정하는 반환 된 객체 참조에 추가로 통화를 할 수 있습니다.

obj.setName("test_name_" + index); 

이렇게하려면, 내가 선언 한 적절한 포인트 컷을 가지고있는가는되어 새로운 측면 : 그래서 위의 코드를 수정 (또는 루의 ITD에서 밀어)하지 않고, 나는 하나 개의 추가 통화를 할 특정 방법을 조언합니다.

public aspect MyObjectDataOnDemandAdvise { 
    pointcut pointcutGetNewTransientMyObject() : 
     execution(public MyObject MyObjectDataOnDemand.getNewTransientObject(int)); 

    after() returning(MyObject obj) : 
     pointcutGetNewTransientMyObject() { 
     obj.setName("test_name_" + index); 
    } 
} 

이제 이클립스에 따르면 포인트 컷은 올바르게 작성되었으며 적절한 방법을 조언하고 있습니다. 그러나 name 속성이 필요하지만 설정되지 않기 때문에 객체를 지속하는 통합 테스트가 여전히 실패하기 때문에 상황이 발생하지 않는 것 같습니다. 그리고 Manning의 AspectJ in Action (4.3.2 절)에 따르면 after advice는 리턴 값을 수정할 수 있어야한다. 하지만 어쩌면 around() 조언을 대신 할 필요가 있을까요?

답변

0

Eclipse에서 버그로 인해 제대로 작동하지 않기 때문에 약간의 문제가 있음이 밝혀졌습니다. Spring Roo 셸에서 "perform tests"를 실행하면 모든 것이 작동하지만 JUnit 테스트 케이스로 패키지를 실행하는 것이 효과가 없었습니다.

위의 코드는 "after returning"조언을 사용하여 작동합니다. 그러나 메소드에 전달 된 인수에 액세스 할 수있는 "around"advice를 사용하여 구현할 수도 있습니다.

MyObject around(MyObjectDataOnDemand dod, int index) : 
    pointcutGetNewTransientMyObject() 
    && target(dod) && args(index) { 

    // First, we go ahead and call the normal getNewTransient() method 
    MyObject obj = proceed(dod, index); 

    /* 
    * Then we set additional properties which are required, but which 
    * Spring Roo's auto-created DataOnDemand method failed to set. 
    */ 
    obj.setName("name_" + index); 

    // Lastly, we return the object reference 
    return obj; 
} 

우리의 특별한 경우, "after returning"조언은 더 간결하고 읽기 쉽습니다. 그러나 "둘러싼"조언을 사용하여 인수에 액세스하는 방법을 아는 것도 유용합니다. 나는 응답을 tgharold하는 코멘트를 추가 한 것이지만, 충분한 명성을하지 않아도

pointcut methodToMonitor() : execution(@Monitor * *(..)); 

Object around() : methodToMonitor() { 
    Object result=proceed(); 

    return result; 
} 
0

여기 주위에 사용하는 예입니다. (내 첫 번째 게시물입니다)

나는 이것이 오래되었다는 것을 알고 있지만, 여기에서 찾고있는 사람들은 AspectJ에서 Before advice 나 after advice의 인수를 thisJoinPoint을 사용하여 얻을 수 있다는 것을 알 수 있다고 생각합니다. 예를 들어

: http://eclipse.org/aspectj/doc/next/progguide/language-thisJoinPoint.html 일 :

after() : MyPointcut() { 
    Object[] args = thisJoinPoint.getArgs(); 
    ... 

추가 정보.

누군가에게 유용 할 것입니다.