4

HTTPServletRequest をハイジャックし、AspectJ を使用して値をログに記録したいと考えています。ただし、JoinPoint に格納されるのは「RequestFacade」オブジェクトです。このオブジェクトでできることはあまりないようです。私のロギング戦略はすべて間違っていますか? HttpServletRequest から有用な情報を取得するにはどうすればよいですか? メソッドを呼び出す前にラップを解除する必要がある場合、それはアプリケーションでの AOP の目的を無効にします。

それが違いを生む場合、私はGlassfishサーバーを使用しています。

@Before("execution(* Service.testAuditRecord(..))")
public void logBefore(JoinPoint joinPoint) {
    System.out.println("logBefore  --->"  + joinPoint.getSignature().getName());
    System.out.println("logBefore--->Args : " + Arrays.toString(joinPoint.getArgs()));
}

RequestFacade レコード

INFO: logBefore  --->testAuditRecord
INFO: logBefore--->Args : [org.apache.catalina.connector.RequestFacade@4dbfa7d0]
4

2 に答える 2

3

HttpServletRequestインターフェースです。各サーブレット コンテナには独自の実装があります。org.apache.catalina.connector.RequestFacadeその一つです。

そうは言ってもHttpServletRequest、実際の実装を気にすることなく、 のメソッドを自由に使用できます。

の署名はService.testAuditRecord()何ですか? HttpServletRequest引数として取りますか?もしそうなら、AspectJ はあまり手間をかけずに強く型付けされたインスタンスを提供するはずです。これを試して:

@Before("execution(* Service.testAuditRecord(..)) && args(request)")
public void logBefore(JoinPoint joinPoint, HttpServletRequest request) {
  //...
于 2013-01-11T17:47:31.160 に答える