JEE6: получить аннотацию Binding в реализации перехватчика - PullRequest
1 голос
/ 24 января 2012

У меня есть привязка перехватчика, которая параметризована:

@InterceptorBinding
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface Traced {

   @Nonbinding
   boolean traceFull() default true;
}

Затем я определяю реализацию перехватчика

@Interceptor
@Traced
public class TracingInterceptor implements Serializable { ... }

В реализации я хочу проверить, какое значение установлено для параметра traceFull. (Я не хочу реализовывать три реализации перехватчика для true, false и null)

Итак, моя реализация проверяет Interceptor-Binding-Annotation перехваченного метода:

Traced traceAnnotation = context.getMethod().getAnnotation(Traced.class);
if (traceAnnotation != null && traceAnnotation.traceFull()) { ... }

Это работает нормально, но если я использую привязку со стереотипом или вложенным перехватчиком, я не получаю @Traced annotatopn метода и не могу проверить значение, которое установлено.

Итак, мой вопрос: как я могу получить привязку 'call' в моей реализации перехватчика?

Ответы [ 2 ]

1 голос
/ 03 июля 2014

Вы можете использовать отражение даже для разрешения аннотации от стереотипов.

Находясь в той же ситуации (требуя дополнительной необязывающей информации в перехватчике), я реализовал служебный метод:

public <T extends Annotation> T findBindingAnnotation( Class<T> bindingType, InvocationContext ic )
{
    Method method = ic.getMethod();
    if ( method != null && method.isAnnotationPresent( bindingType ) )
    {
        return method.getAnnotation( bindingType );
    }
    Class<? extends Object> type = ic.getTarget().getClass();
    if ( type.isAnnotationPresent( bindingType ) )
    {
        return type.getAnnotation( bindingType );
    }

    T annotationFromStereoType = annotationFromStereoType( bindingType, type );
    if ( annotationFromStereoType != null )
    {
        return annotationFromStereoType;
    }

    throw new UnsupportedOperationException( "no binding annotation found: " + bindingType.getCanonicalName() );
}

private <T extends Annotation> T annotationFromStereoType( Class<T> bindingType, Class<? extends Object> type )
{
    for ( Annotation annotation : type.getAnnotations() )
    {
        Class<? extends Annotation> annotationType = annotation.annotationType();
        if ( annotationType.isAnnotationPresent( Stereotype.class ) )
        {
            if ( annotationType.isAnnotationPresent( bindingType ) )
            {
                return annotationType.getAnnotation( bindingType );
            }
            else
            {
                T recursiveLookup = annotationFromStereoType( bindingType, annotationType );
                if ( null != recursiveLookup )
                {
                    return recursiveLookup;
                }
            }
        }
    }
    return null;
}
0 голосов
/ 25 января 2012

Это невозможно в CDI 1.0, но должно быть в CDI 1.1

...