Расширение CDI, изменение обработанного типа

StackOverflow https://stackoverflow.com//questions/20050437

  •  26-12-2019
  •  | 
  •  

Вопрос

Использование сварного шва 1.1.13.Винал в тесте с Arquillian ....

Допустим, я впрыскиваю в поле что-то волатильное. Что-то вроде недвижимости, подлежащего изменению, что я хочу, чтобы боб, владел точкой впрыска, чтобы получить меры изменения. Думал о создании расширения CDI.

поймал событие ProcessannatedTedType и ищете все поля, которые имеют пользовательскую аннотацию на точках впрыска поля:

 <T> void pat(@Observes ProcessAnnotatedType<T> event, BeanManager bm) {
   final AnnotatedType<T> target = event.getAnnotatedType();

   for (AnnotatedField<? super T> field : target.getFields())
     if (field.isAnnotationPresent(Value.class)) {  // ignore that I don't check @Inject here for the moment
        CtClass wrapper = pool.get(target.getJavaClass().getName());
        ConstPool cp = wrapper.getClassFile().getConstPool();

        CtMethod m = CtNewMethod.make(....)
        ....
        wrapper.addMethod(m);

        event.setAnnotatedType(bm.createAnnotatedType(wrapper.toClass()));
     }
 }
.

Даже схватил после этого все точки впрыска для полей и заменил базовый Weldfield с новым полем, соответствующим типу «обертка». В противном случае валидация бобов не удается.

Но это работает только для настроек вещей во время запуска, если, например, Arquillian использует Manager Bean-Manager для инициализации класса, который впрыскивает один из моих «обернутых». Вещи не удаются, поскольку резольвер бобов использует тип в качестве хеш-ключа для поиска бобов.

В основном я не думаю, что могу «маскировать» класс, который аннотирован (изготовлен в бону) на CDI с дополнительным способом для получения пользовательских событий. Было бы прохладно, но тип - это тип (то есть не знаю, как прокси или подделать равных / хэшкод).

Это было полезно?

Решение

получил это.Оказывается функция Compute Value (расширение Google) внутри Resolver SypeAfeBeanResolver (по крайней мере, реализация CDI сварки) умна.Если я просто продю класс:

 CtClass wrapper = pool.makeClass(target.getJavaClass().getName()+"Proxy");
 wrapper.setSuperclass(pool.get(target.getJavaClass().getName()));
 .....
 final AnnotatedType<T> other = bm.createAnnotatedType(wrapper
                    .toClass());
.

Тогда все работает нормально.Проверено захватить событие в бобовом бобе.Опубликует код на велосипеде с комментарием.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top