Aspectj가 스프링 프레임워크에서 모든 이벤트를 포착하지 못합니까?

StackOverflow https://stackoverflow.com/questions/39639

  •  09-06-2019
  •  | 
  •  

문제

내 프로젝트는 Spring Framework 2.5.4를 기반으로 합니다.그리고 일부 컨트롤러에 대한 측면을 추가하려고 합니다(Aspectj 1.5.3을 사용합니다).

application-servlet.xml에서 자동 프록시를 활성화하고 다음 줄을 xml 파일 끝에 붙여넣었습니다.

<aop:aspectj-autoproxy />
<bean id="auditLogProcessor" class="com.example.bg.web.utils.AuditLogProcessor" />

생성된 측면:

package com.example.bg.web.utils;

import org.apache.log4j.Logger;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class AuditLogProcessor
{
    private final static Logger log = Logger.getLogger(AuditLogProcessor.class);

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))")
    public void afterHandleRequest() {
        log.info("test111");
    }

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))")
    public void afterRebuildThumbnail() {
        log.info("test222");
    }
}

내 컨트롤러:

class AssetAddController implements Controller
class AssetThumbnailRebuildController extends MultiActionController

Aspect Advisors 및 Invoke 컨트롤러에서 브레이크 포인트를 설정하면 juffhandlerequest () 만 포착하지만 AfterRebildThumbnail ()은 무엇을 잘못 했습니까?

메모

나는 SO 베타에 액세스할 수 없는 내 친구를 대신하여 이 질문을 하고 있는데, 그것이 무엇에 관한 것인지 전혀 모릅니다.

편집하다

실제로 일부 철자 오류가 있었습니다. Cheekysoft에게 감사드립니다.그러나 문제는 여전히 지속됩니다.

도움이 되었습니까?

해결책

Spring의 AOP 프록시를 사용하고 있기 때문에 중단점이 적중되지 않습니다.보다 이해-AOP-프록시 AOP 프록시가 어떻게 특별한지에 대한 설명입니다.

기본적으로 MVC 프레임워크는 handleRequest 컨트롤러 프록시의 메서드(예: MultiActionController 기본 클래스 구현으로 사용하고 있는 경우) 이 메서드는 buildThumbnail 메서드에 대한 "내부" 호출을 수행하지만 이는 프록시를 통과하지 않으므로 어떤 측면도 선택하지 않습니다.(이것은 메소드가 최종적인 것과는 아무런 관련이 없습니다.)

원하는 것을 달성하려면 로드 타임 위빙(Spring이 매우 훌륭하게 지원함)을 통해 "실제" AOP를 사용하여 조사하십시오.

다른 팁

AspectJ는 Spring Web MVC 프레임워크의 클래스와 잘 작동하지 않습니다. 페이지 오른쪽에 있는 "확장을 위해 열기..." 상자 하단을 읽어보세요.

대신 다음 내용을 살펴보세요. 핸들러인터셉터 상호 작용.

Controller 클래스가 모두 POJO이기 때문에 새로운 Spring MVC Annotation도 잘 작동할 수 있지만 직접 시도하지는 않았습니다.

기본적인 구성은 괜찮은 것 같습니다.

내부 포인트컷을 정의하지 않고 사후 조언을 적용해야 하는 방법만 지정하면 구문이 약간 단순화될 수 있습니다.(메소드에 대한 명명된 포인트컷이 자동으로 생성됩니다.)

예를 들어

@After( "com.example.bg.web.controllers.assets.AssetAddController.handleRequest()" )
public void afterHandleRequest() {
    log.info( "test111" );
}

@After( "com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail()" )   
public void afterRebuildThumbnail() {
    log.info( "test222" );
}

buildThumbnail 메소드가 최종 메소드가 아니고 메소드 이름과 클래스가 올바른 경우에 한합니다.왜 이것이 작동하지 않는지 모르겠습니다.

보다 http://static.springframework.org/spring/docs/2.0.x/reference/aop.html

철자법만큼 간단한가요?아니면 질문에 오타가 있는 건가요?가끔 글을 쓰시죠 rebuildThumbnail 그리고 가끔 넌 글을 쓰잖아 rebildThumbnail

조언으로 재정의하려는 방법은 MVC 프레임워크의 최종 방법이 아니므로 bpapas 답변이 유용하지만 이 경우에는 이것이 문제가 아니라는 것이 내 이해입니다.그러나 다음 사항을 확인하십시오. rebuildThumbnail 컨트롤러 작업이 최종이 아닙니다

@bpapas:내가 틀렸다면 정정해주세요.프로그래머 자신의 컨트롤러 동작은 그가 무시하려고 하는 것입니다.MultiActionController 소스(및 그 상위 소스)를 보면 스택에 잠재적으로 최종화된 유일한 메서드는 다음과 같습니다. MultiActionController.invokeNamedMethod, 비록 이것이 그 당시 스택에 있었는지 아닌지 100% 확신할 수는 없습니다.스택 위쪽에 완성된 메서드가 있으면 더 아래쪽에 있는 메서드에 AOP 조언을 추가하는 데 문제가 발생합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top