2013-06-05 3 views
1

Может быть, заголовок «может аннотация получить объект контекста?» неверно, но я не знаю, как дать ему правильный и понятный.может аннотация получить объект контекста?

Я использую Spring AOP + Java аннотаций, чтобы сохранить журнал, вот мой код:

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 в аннотации к базе данных.

Теперь вопрос methodDesp в аннотации динамический, я хочу получить объект this и получить его category.

Кажется, что Java Annotation не поддерживает это, возможно, поддерживает, но я не знаю, как это сделать.

ответ

2

Что вы можете сделать, это использовать какой-то язык выражений в значении аннотации, а затем запустить в интерпретаторе некоторый интерпретатор. Одним из примеров использования SPEL могут выглядеть следующим образом:

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

И в вашем коде советов, вы можете извлечь маркер экспрессии, используют в SpelExpression и передать ему target ссылки как корневой объект (вы можете проверить что доступно из коробки в SPEL API для поддержки вашего прецедента (-ов)).

+0

спасибо большое. Выражение выглядит так: 'methodDesp =" 'категория сохранения, название категории:'. Concat (category.name) "', я только что протестировал. – hiway

2

кажется, что аннотации Java не поддерживает этот

Вы правильно - нет никакого способа сделать это в чистом Java.

Причина заключается в том, что, поскольку аннотации статические метаданные, который подключен в классов и определенных на время компиляции (this начало существовать только во время выполнения, а не во время компиляции).

Другими словами, нет простого способа сделать methodDesp некоторого аннотированного метода динамического класса, поскольку его значение должно быть разрешено статически во время компиляции.

Однако технически существует способ сделать что-то подобное. О чем я говорю, используется javassist для управления или создания ваших классов (и аннотаций, применяемых к ним) во время выполнения. Но будьте осторожны, что это довольно хакерский путь, и я вообще не рекомендую туда ехать.

Смежные вопросы