2015-07-02 4 views
0

Я пытаюсь получить доступ к пользовательским значениям аннотации из jointCut. Но я не мог найти способ.Как получить доступ к пользовательским значениям аннотации в весеннем аспекте

Мой пример кода:

@ComponentValidation(input1="input1", typeOfRule="validation", logger=Log.EXCEPTION) 
public boolean validator(Map<String,String> mapStr) { 
    //blah blah 
} 

Попытка доступа @Aspect класса.

Но, я не видел никаких возможностей для доступа к значениям.

Way я пытаюсь получить доступ ниже код

CodeSignature codeSignature = (CodeSignature) joinPoint.getSignature(); 
String[] names = codeSignature.getParameterNames(); 
MethodSignature methodSignature = (MethodSignature) joinPoint.getStaticPart().getSignature(); 
Annotation[][] annotations = methodSignature.getMethod().getParameterAnnotations(); 
Object[] values = joinPoint.getArgs(); 

я не видел каких-либо возвращает значение входного = input1. как добиться этого.

+0

Можете ли вы предоставить весь код, включая всю пользовательскую проверку. – Mudassar

+0

Привет, Я тоже нахожусь на этапе обучения пользовательской аннотации с aspectj. Можете ли вы предоставить мне демонстрацию того, как использовать пользовательскую аннотацию? Я новичок в весеннем аспекте. Любая помощь будет оценена. Заранее спасибо. – James

ответ

1

Хотя ответ Jama Asatillayev является правильным с простой точки зрения Java, он включает отражение.

Но вопрос был о Spring AOP или AspectJ, и есть гораздо более простой и более канонический способ привязки согласованных аннотаций к параметрам параметров аспект с синтаксисом AspectJ - без какого-либо отражения, BTW.

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 

import my.package.ComponentValidation; 

@Aspect 
public class MyAspect { 
    @Before("@annotation(validation)") 
    public void myAdvice(JoinPoint thisJoinPoint, ComponentValidation validation) { 
     System.out.println(thisJoinPoint + " -> " + validation); 
    } 
} 
0

Для получения значений, используйте ниже:

вы можете вызвать validation.getInput1(), если у вас есть этот метод в ComponentValidation аннотаций.

0

Например, если вы определили метод в интерфейсе аннотации, как показано ниже:

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface AspectParameter { 
    String passArgument() default ""; 
} 

, то вы можете получить доступ к классу и значения метода в аспекте, как показано ниже:

@Slf4j 
@Aspect 
@Component 
public class ParameterAspect { 

    @Before("@annotation(AspectParameter)") 
    public void validateInternalService(JoinPoint joinPoint, AspectParameter aspectParameter) throws Throwable {  
     String customParameter = aspectParameter.passArgument(); 
    } 
}