2013-01-09 3 views
0

com.xmy.package 패키지와 그 하위 패키지 내의 모든 클래스에 대한 모든 메소드 호출을 가로 채기 위해 pointcut 표현식을 생성하려고합니다. org.springframework.aop.framework.AopConfigException : 내 XML은, 코드에 의한 Spring AOP Poincut 표현

<aop:config> 
    <aop:pointcut id="allCalls" expression="within(com.xmy.package..*)" /> 
    <aop:aspect ref="loggingService"> 
     <aop:around method="logMethodFlow" pointcut-ref="allCalls" /> 
    </aop:aspect> 
</aop:config> 

아래 보이는 클래스 ...... .. 의 CGLIB의 서브 클래스를 생성 할 수 없습니다. . . . . 원인 : java.lang.IllegalArgumentException : 슈퍼 클래스에는 null 생성자가 없지만 인수가 제공되지 않았습니다.at net.sf.cglib.proxy.Enhancer.emitConstructors (Enhancer.java:721) at net.sf.cglib.proxy .Enhancer.generateClass (Enhancer.java:499) at net.sf.cglib.transform.TransformingClassGenerator.generateClass (TransformingClassGenerator.java:33) at net.sf.cglib.core.DefaultGeneratorStrategy.generate (DefaultGeneratorStrategy.java:25)) at net.sf.cglib.core.AbstractClassGenerator.create (AbstractClassGenerator.java:216) at net.sf.cglib.proxy.Enhancer.createHelper (Enhancer.java:377) at net.sf.cglib.proxy .Enhancer.create (Enhancer.java:285) at org.springframework.aop.framework.Cglib2AopProxy.getPr 옥시 (Cglib2AopProxy.java:201)

그러나 특정 클래스 (아래처럼)에 대해 pointcut 표현식을 사용하면 올바르게 작동합니다.

<aop:config> 
    <aop:pointcut id="classCalls" expression="execution(* com.xmy.package.MyClass.*(..))" /> 
    <aop:aspect ref="loggingService"> 
     <aop:around method="logMethodFlow" pointcut-ref="classCalls" /> 
    </aop:aspect> 
</aop:config> 

모든 메소드 호출을 특정 패키지 및 하위 패키지에 기록하는 방법을 알려주십시오.

답변

0

특정 패키지 및 해당 하위 패키지의 모든 메소드 호출에 대해 포인트를 잘라냅니다. 예 com.xmy.package1.subpackages ... com.xmy.package2.subpackages ... 들어

<aop:config> 
    <aop:pointcut id="pkg1AllCalls" expression="execution (* com.xmy.package1+*())" /> 
    <aop:pointcut id="pkg2AllCalls" expression="execution (* com.xmy.package2+*())" /> 
    <aop:aspect ref="loggingService"> 
     <aop:around method="logMethodFlow" pointcut-ref="pkg1AllCalls" /> 
     <aop:around method="someOtherMethod" pointcut-ref="pkg2AllCalls" /> 
    </aop:aspect> 
</aop:config> 

즉 간결한 표현 및 유지 보수가 모두 2 가지 포인트 컷 수를 정의한다. 참고someOtherMethod()은 내가 두 개의 다른 pointcuts를 사용하기 위해 새로 추가 한 것입니다. @AspectJ

로 사용하는 경우 3.0

는 그러나이 쉽게 달성 할 수있는 봄 문서의 6.4.2 절 : 심판 위의 그림과 같이 두 개의 포인트 컷을 병합 한 경우 XML 기반 스타일의 제한이 있습니다

@Pointcut(execution(* get*())) 
    public void propertyAccess() {} 

    @Pointcut(execution(org.xyz.Account+ *(..)) 
    public void operationReturningAnAccount() {} 

    @Pointcut(propertyAccess() && operationReturningAnAccount()) 
    public void accountPropertyAccess() {}