Как получить связанный параметр с пользовательской аннотацией - PullRequest
0 голосов
/ 29 августа 2018
@RestController
public class TestController {

    @GetMapping("/hello/{userId}")
    @Audit(type = AuditType.CREATE)
    public String hello(@AuditField @PathVariable long userId) {
        return "hello";
    }

}

Я хочу отсканировать аннотацию @ Audit вместе с @ AuditField . Сканирование @Audit работает нормально, но я также хочу получить значение параметра @ AuditField . Вот в моем случае userId .

Я определил Аспект для @AfterReturning advice.

import java.lang.annotation.Annotation;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


@Aspect
@Component
public class AuditAspect {

  @AfterReturning(pointcut = "@annotation(audit)", returning = "result")
  public void audit(JoinPoint jp, Object result, Audit audit) throws Exception {

   List<Object> auditFields = getAuditData(jp.getArgs());
   System.out.println(auditFields);
  }

  private List<Object> getAuditData(Object[] args) {
    return Arrays.stream(args)
        .filter(arg -> arg instanceof AuditField)
        .collect(Collectors.toList());
  }
}

Но при доступе к hello / 1 AuditFields показывает пустое.

1 Ответ

0 голосов
/ 01 сентября 2018

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

...