1

也许标题“注释可以获取上下文对象吗?” 是不正确的,但我不知道如何给它一个正确和明确的。

我使用 Spring AOP + Java Annotation 来保存日志,这是我的代码:

类别操作.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注解,则将methodDespin注解保存到数据库。

现在的问题是methodDespin 注释是动态的,我想获取this对象并检索其category属性。

Java Annotation 似乎不支持这个,也许它支持但我不知道如何。

4

2 回答 2

2

您可以做的是在注释值中使用某种表达式语言,然后在您的建议代码中运行一些解释器。使用 SPEL 的一个示例可能如下所示:

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

然后在您的建议代码中,您可以提取表达式标记,使用 aSpelExpression并将target引用作为根对象传递给它(您可能需要检查 SPEL API 中开箱即用的内容以支持您的用例(s ))。

于 2013-06-05T06:33:02.863 回答
2

Java Annotation 似乎不支持这个

你是对的 - 在纯 java 中没有办法做到这一点。

原因是因为注解是连接到类中并在编译时定义的静态元数据(仅在运行时开始存在,而不是在编译时存在)。this

换句话说,没有直接的方法可以使methodDesp某个类的某些带注释的方法成为动态的,因为它的值必须在编译时静态解析。

但是,从技术上讲,有一种方法可以做你想做的事情。我所说的是在运行时使用javassist来操作或创建您的类(以及应用于它们的注释)。但请注意,这是一种相当老套的方式,我通常不建议去那里。

于 2013-06-05T06:21:12.667 回答