2015-08-03 4 views
1

Я добавляю несколько журналов к моему приложению на основе Spring, я хочу регистрироваться для каждого метода, пользователя, который выполняет действие. Ниже вы можете найти пример метода.Создание пользовательской аннотации в Java

@Override 
@Transactional 
public void deleteAccount(Long id){ 
    String principal = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    MDC.put("username",principal); 
    accountDao.remove(id); 
    List<String> action = (List<String>) MDC.get("action"); 
    if (action == null) 
     action=new ArrayList<String>(); 
    action.add("Deleted account with id:"+id); 
    MDC.put("action", action); 
} 

Первые две строки метода являются универсальными, поэтому я хочу два избежать, чтобы добавить эти две строки в каждом методе:

String principal = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    MDC.put("username",principal); 

Так я думал, чтобы создать пользовательский аннотацию, чтобы получить пользователя и поместить его в журнал MDC. Таким образом, я мог бы просто применить эту аннотацию к методам, в которых мне нужен этот журнал, я не уверен, как это сделать, не могли бы вы мне помочь?

Благодаря

+3

Я бы сказал, что вместо аннотации я использую Aspect для реализации вашей логики. http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.htm должно помочь асинхронно запускать ваши глобальные строки кода. – Jango

ответ

-6

Использование C-макрос для этого .. Нет, если серьезно, то почему бы не использовать C-препроцессор для этого? Просто определите макрос для этих двух строк, используя #define, а затем передайте файл с ним на препроцессор. Он должен работать.

UPD. Сделайте это вот так:

#define MDCLOG { 
    String principal = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    MDC.put("username",principal); 
} 
public void deleteAccount(Long id) { 
    MDCLOG 
    accountDao.remove(id); 
    List<String> action = (List<String>) MDC.get("action"); 
    if (action == null) 
     action=new ArrayList<String>(); 
    action.add("Deleted account with id:"+id); 
    MDC.put("action", action); 
} 
+1

этот вопрос отмечен 'java' ... –

+0

Я знаю, но моя идея может быть лучше, чем аннотации или аспекты. C-preprocessor не имеет никаких запросов в файле –

+0

, который может быть прав. но это не поможет OP - (s) он вряд ли перепишет код в C. –