Domanda

Utilizzo della saldatura 1.1.13.finale in prova con Arquillian ....

Diciamo che sto iniettando in un campo qualcosa di volatile. Qualcosa come una proprietà soggetta a cambiare che voglio che il bean possedere il punto di iniezione per ricevere eventi di modifica. Pensato di creare un'estensione CDI.

Catturato Evento ProcessANNOTATEDTYPE e Alla ricerca di tutti i campi che hanno un'annotazione personalizzata sui punti di iniezione del 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()));
     }
 }
.

aveva addirittura afferrato in seguito tutti i punti di iniezione per i campi e sostituivano il saldardo sottostante con un nuovo campo corrispondente al tipo "wrapper". Altrimenti la convalida del fagiolo non riesce.

Ma questo funziona solo per la configurazione di roba durante l'avvio non quando ad esempio Arquillian utilizza il Gestione Beany per inizializzare una classe che inietta uno dei miei "wraps". Le cose falliscono poiché il resolver del fagioli utilizza il tipo come tasto hash per trovare i fagioli.

Fondamentalmente non penso di poter "mascherare" una classe annotata (trasformata in un fagiolo) dal CDI con un metodo extra per ricevere eventi personalizzati. Sarebbe stato bello ma un tipo è un tipo (I.e. Nessuna idea di come proxy o falso / hashcode).

È stato utile?

Soluzione

ha capito.Disattiva la funzione Valore di calcolo (estensione di Google) all'interno del risolutore di TystaFeBeanResolver (almeno l'implementazione della saldatura CDI) è intelligente.Se estendo solo la classe:

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

Allora tutto funziona bene.Testato catturare un evento in un fagiolo.Pubblicherà il codice su un GIST con un commento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top