Question

Utilisation de SOUDAGE 1.1.1.FORME AU TEST AVEC Arquillian ....

Disons que j'injecte dans un champ quelque chose de volatile. Quelque chose comme une propriété susceptible de changer que je veux que le bean possède le point d'injection pour recevoir des événements de changement. Pensé à créer une extension CDI.

Evénement processannoté de processannoTtype et à la recherche de tous les champs ayant une annotation personnalisée sur les points d'injection de champ:

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

avait même été saisi par la suite tous les points d'injection pour les champs et remplacé le weldfield sous-jacent avec un nouveau champ correspondant au type "Wrapper". Sinon la validation des haricots échoue.

Mais cela ne fonctionne que pour la configuration de Stuffing lors du démarrage pas quand par exemple Arquillian utilise le gestionnaire de haricot pour initialiser une classe qui injecte l'une de mes "enveloppes". Les choses échouent car le résolveur de haricot utilise le type comme une clé de hachage pour trouver des haricots.

Fondamentalement, je ne pense pas que je puisse "masquer" une classe annotée (fabriquée dans un haricot) par le CDI avec une méthode supplémentaire pour recevoir des événements personnalisés. Aurait été cool mais un type est un type (c'est-à-dire aucune idée de la proxy ou de simuler des égaux / Hashcode).

Était-ce utile?

La solution

obtenu.Souvie la fonction de valeur de calcul (Extension de Google) à l'intérieur du résolveur TypeafeBeanresolver (au moins la mise en œuvre de la soudure CDI) est intelligente.Si je viens d'étendre 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());

Alors tout fonctionne bien.Testé capturer un événement dans un haricot.Postera le code sur un gist avec un commentaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top