2013-11-18 2 views
0

Использование Weld 1.1.13.Final в тесте с Arquillian ....CDI расширение, изменение типа обрабатываются

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

Пойманного событие ProcessAnnotatedType и ищу все поля, которые имеют собственную аннотацию точек ввода поля:

<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 с новым полем, соответствующим тип «обертка». В противном случае проверка валиков не выполняется.

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

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

+0

Ваш вопрос немного сложно понять. Объекты CDI вводятся во время выполнения и ограничены в определенных пределах. Зависимые фасонные компоненты всегда создаются заново при введении, область применения кэшируется в течение всего срока службы приложения. Возможно, если бы вы уточнили некоторые из своих вопросов, это поможет понять, что вы пытаетесь сделать. –

+0

Единственное, о чем я могу думать сейчас, это сохранить слабую ссылку на beans (как-то контролировать вызовы с интерфейса BeanManager, чтобы быть портативным) и делать отражение в полях. –

+0

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

ответ

0

Got it. Вызывает функцию вычисления значения (расширение google) внутри распознавателя TypeSafeBeanResolver (по крайней мере, реализация CDI Weld). Если я только продлю класс:

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

тогда все работает нормально. Протестировано захват события в компоненте. Выведет код в Gist с комментарием.

Смежные вопросы