Pregunta

usando la soldadura 1.1.13.final en la prueba con arquillian ...

Digamos que me inyecté en un campo algo volátil. Algo como una propiedad sujeta a cambios que quiero que el frijol posee el punto de inyección para recibir eventos de cambio. Pensé en crear una extensión CDI.

Evento atrapado de ProcessNotatedType y buscando todos los campos que tengan una anotación personalizada en los puntos de inyección de campo:

 <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()));
     }
 }

Incluso se había agarrado a partir de entonces todos los puntos de inyección para los campos y reemplazaban al campo de soldadura subyacente con un nuevo campo correspondiente al tipo "envoltorio". De lo contrario, la validación de frijoles falla.

Pero esto solo funciona para la configuración de las cosas durante la puesta en marcha, no cuando, por ejemplo, Arquillian usa el gerente de frijoles para inicializar una clase que inyecta una de mis "envolturas". Las cosas fallan, ya que el resolvedor de frijoles usa el tipo como una llave de hash para encontrar frijoles.

Básicamente, no creo que pueda "enmascarar" una clase que se anota (hecha en un frijol) por el CDI con un método adicional para recibir eventos personalizados. Habría sido genial, pero un tipo es un tipo (es decir, no tiene idea de cómo proxy o falsificar los iguales / hashcode).

¿Fue útil?

Solución

lo tengo.Resulta la función de valor de cómputo (extensión de Google) dentro del residente de TyperSafeBeanResolver (al menos la implementación de la soldadura CDI) es inteligente.Si acabo de extender la clase:

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

Entonces todo funciona bien.Probado capturando un evento en un frijol.Publicaré el código en un GIST con un comentario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top