1

多分タイトル「アノテーションはコンテキストオブジェクトを取得できますか?」は正しくありませんが、正しく明確にする方法がわかりません。

Spring AOP + Java Annotation を使用してログを保存します。コードは次のとおりです。

CategoryAction.java :

@ServiceTracker(methodDesp="save category, category name:"+this.category.getName())
public String save() throws Exception
{
    this.categoryService.save(this.category);
    this.setJsonDataSimply(null);
    return "save";
}

TrackAdvice.java :

public Object trackAround(ProceedingJoinPoint point) throws Throwable
{
    String log = "success";
    ServiceTracker tracker = null;
    Method method = null;
    AbstractAction action = null;
    try
    {
        Object result = point.proceed();
        action = (AbstractAction) point.getTarget();
        MethodSignature signature = (MethodSignature) point.getSignature();
        method = signature.getMethod();
        tracker = method.getAnnotation(ServiceTracker.class);
        return result;
    }
    catch (Exception e)
    {
        log = e.getMessage();
        throw e;
    }
    finally
    {
        if (tracker != null)
        {
            String userId = (String) ActionContext.getContext().getSession().get(Constant.USERID);
            if (userId == null)
            {
                userId = "unknown";
            }
            TrackLog t = new TrackLog();
            t.setWhen(new Date());
            t.setUserId(userId);
            t.setResult(log);
            t.setMethodName(action.getClass().getCanonicalName() + "." + method.getName());
            t.setMethodDesp(tracker.methodDesp());
            this.trackService.save(t);
        }
    }
}

ServiceTracker私のTrackAdviceクラスでは、現在実行中のメソッドを取得し、メソッドに注釈がある場合は、その注釈をデータベースにServiceTracker保存します。methodDesp

問題は、 in アノテーションが動的であることです。オブジェクトを取得して、そのプロパティを取得しmethodDespたいと考えています。thiscategory

Java Annotation はこれをサポートしていないようです。おそらくサポートしていますが、方法がわかりません。

4

2 に答える 2

2

できることは、注釈値である種の式言語を使用してから、アドバイスコードでインタープリターを実行することです。SPEL を使用した 1 つの例は次のようになります。

@ServiceTracker(methodDesp="save category, category name: #{category.name}")

アドバイス コードでは、式トークンを抽出し、a を使用SpelExpressionして参照をルート オブジェクトとして渡すことがtargetできます (ユースケースをサポートするために、SPEL API ですぐに使用できるものを確認することをお勧めします)。 )))。

于 2013-06-05T06:33:02.863 に答える