0

パッケージ com.xmy.package とそのサブパッケージ内のすべてのクラスへのすべてのメソッド呼び出しをインターセプトするポイントカット式を作成したいと考えています。私のxml、コードは以下のようになります

<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>

原因: org.springframework.aop.framework.AopConfigException: クラスの CGLIB サブクラスを生成できませんでした...... .. . . . . 原因: java.lang.IllegalArgumentException: スーパークラスには null コンストラクターがありませんが、net.sf.cglib.proxy.Enhancer の net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:721) で引数が指定されていません。 generateClass(Enhancer.java:499) で net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33) で net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) で net.sf .cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216) で net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377) で net.sf.cglib.proxy.Enhancer.create(Enhancer.java) :

しかし、特定のクラス(以下のように)にポイントカット式を使用すると、正常に機能します。

<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>

特定のパッケージとそのサブパッケージへのすべてのメソッド呼び出しをログに記録する方法を教えてください。

4

1 に答える 1

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 つの異なるポイントカットを定義します。2 つの異なるポイントカットを使用するために新しく追加したものであることに注意してください。someOtherMethod()

XML ベースのスタイルには制限があります。上記のように 2 つのポイントカットをマージする必要がある場合は、Spring Docs 3.0 の 6.4.2 セクションを参照してください。

ただし、これは @AspectJ として使用すると簡単に実現できます

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

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

  @Pointcut(propertyAccess() && operationReturningAnAccount())
  public void accountPropertyAccess() {}
于 2013-01-18T19:32:29.293 に答える