使用焊缝1.1.13.用arquillian的测试进行测试....

让我说我注射了一个挥发性的领域。像一个有关的属性,可以改变,我希望豆类拥有注射点以接收更改事件。考虑创建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验证失败。

,但这仅适用于启动期间的东西设置而不是例如arquillian使用bean manager初始化一个注入我的“包装”的类。由于bean解析器使用类型作为哈希键来查找bean的事物失败。

基本上我不认为我可以通过cdi用额外的方法来“掩盖”由CDI注释(制作成豆类)的类。本来会很酷,但类型是一种类型(即,不知道如何代理或伪造等于/哈希码)。

有帮助吗?

解决方案

得到它。在TypeafeBeAnResolver解析器(至少CDI Weld实现)中删除计算值函数(Google扩展)是智能的。如果我只是延长课程:

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

然后一切正常工作。在豆类中捕获了一个事件。将发表评论的GIST上的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top