3

Spring /AspectJAOPに関して2つの関連する問題があります。私には、サービス、daos、コントローラー、Webフローアクションなど、アプリケーションの任意のクラスからスローされた例外をログに記録する典型的なロガーの側面があります...

@Aspect
public class AspectLogger {

    @AfterThrowing(pointcut = "execution(* com.myapp..*.*(..))", throwing = "t")
    public void logGustavoException(JoinPoint joinPoint, Throwable t) {

        Log logger = LogFactory.getLog(joinPoint.getTarget().getClass());
        logger.error(t.getMessage(), t);
    }
}

私のアプリケーションコンテキストでは、同様に典型的な構成があります...

<context:annotation-config />

<!-- AOP logging config --> 
<aop:aspectj-autoproxy>
    <aop:include name="aspectLogger" />
</aop:aspectj-autoproxy>

<bean id="aspectLogger" class="com.myapp.AspectLogger" />

これはほとんどの部分で正常に機能します。私が抱えている問題は、インターフェイスを実装するWebflowアクションとコントローラーにあります。

1-インターフェースを実装するコントローラー...

コントローラーの1つは、@ RequestMappingハンドラーとして使用されるいくつかのパブリックメソッドを定義するだけでなく、1つのメソッドを定義するインターフェイスを実装します...

@Controller
public class AmazingController implements OutstandingInterface {

    // implements the method from OutstandingInterface
    @Override
    public Object doSomethingOutstanding(){
        ...
    }

    @RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
    public String doSomethingAmazing(HttpSession session, ModelMap model) {
        return "anAmazingViewName";
    }

    ...
}

ここでの問題は、コントローラーがすべてのパブリックメソッド(つまり、コントローラー要求マッピングメソッド)を定義しないインターフェイスを実装しているため、OutstandingInterfaceから'doSomethingOutstanding'メソッドのみをプロキシするコントローラーのプロキシが作成されることです。そのため、リクエストが/amazingUrl.htmに着信すると、Springはそれを適切なリクエストハンドラーにルーティングしません。これは、リクエストマッピングが存在しないかのようです。OutstandingInterfaceを拡張し、コントローラーに必要なリクエストハンドラーメソッドも定義するコントローラーのインターフェイスを定義することでこれを解決しましたが、AspectJのものがそうではないように、コントローラーのインターフェイスを定義する必要があるのは奇妙/間違っているようです't'非表示'リクエストハンドラ..。

@Controller
public interface IAmazingController extends OutstandingInterface{

    @RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
    public String doSomethingAmazing(HttpSession session, ModelMap model);

}

...

public class AmazingController implements IAmazingController {

    @Override
    public Object doSomethingOutstanding(){
        ...
    }

    @Override
    @RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
    public String doSomethingAmazing(HttpSession session, ModelMap model) {
        return "anAmazingViewName";
    }

    ...
}

2-Webflowアクション

2番目の問題は非常に似ています。AspectJ構成を導入した後、Webflowアクションクラスが正しく自動配線されていませんでした-「FantasticActionタイプのBeanが見つかりません」という種類のエラーが発生し続けました。繰り返しになりますが、すべてのActionクラスにインターフェイスを導入しました。これにより、実際のアクション実装クラスではなく、実行時に注入されるプロキシであるため、問題が解決しました。

それで最後に...両方の場合の問題は-私がアドバイスしたいすべてのクラスのインターフェースを定義する必要なしにこれらのAspectJの問題を回避する方法はありますか?

4

1 に答える 1

1

AOP を操作するためのインターフェイスを作成する必要がないように、クラス パスに CGLIB 依存関係を追加する必要があります。

ドキュメントをご覧ください。

于 2012-07-03T15:41:45.193 に答える