当前位置: 首页 > 知识库问答 >
问题:

CDI扩展,更改已处理类型

汪晨
2023-03-14

使用焊接1.1.13。最终在测试与Arquillian......

假设我向一个字段注入了一些不稳定的东西。比如一个受更改影响的属性,我希望拥有注入点的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验证将失败。

但这只适用于启动期间的内容设置,而不适用于例如Arquillian使用Bean Manager初始化注入我的一个“包装”的类。事情失败了,因为Bean Resolver使用Type作为哈希键来查找bean。

基本上,我认为我不能用一个额外的方法来“屏蔽”一个由CDI注释(制作成bean)的类,以接收自定义事件。如果一个类型就是一个类型(也就是说,不知道如何代理或伪造equals/hashCode),那就很酷了。

共有1个答案

龚博涛
2023-03-14

知道了。事实证明,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());

然后一切正常。测试了在bean中捕获事件。将在要点上发布代码并附上注释。

 类似资料:
  • 问题内容: 关于扩展django管理模板的一个(不是这样)快速问题。 我试图通过在结果行(row1和row2类)之间添加一个包含一些与该对象相关的对象的中间行来更改特定模型的结果列表(在django lingo中更改列表)。 我搜索了代码,但没有找到一种方法来执行此操作。非常感谢任何指针。代码也将有所帮助。 PS:我知道我应该设计自己的界面,但这是一个内部项目,我没有太多时间可以花时间。另外,dj

  • 问题内容: 我的Go Web应用程序中有一个相当快捷的错误处理程序,它会引发HTTP错误,记录响应的重要部分并提供错误模板。我想删除在处理程序中多次编写类似代码的重复: 我已经阅读了Error Handling and Go文章,其中定义了一个自定义HTTP处理程序类型,该类型将返回这样的错误类型/结构(甚至返回int,err): 但是我不确定如何保留现有的中间件功能/包装,使我可以像这样链接中间

  • 很多批处理问题都可以通过单进程、单线程的工作模式来完成, 所以在想要做一个复杂设计和实现之前,请审查你是否真的需要那些超级复杂的实现。 衡量实际作业(job)的性能,看看最简单的实现是否能满足需求: 即便是最普通的硬件,也可以在一分钟内读写上百MB数据文件。 当你准备使用并行处理技术来实现批处理作业时,Spring Batch提供一系列选择,本章将对他们进行讲述,虽然某些功能不在本章中涵盖。从高层

  • 4.1扩展断点处理 在前面的章节中我们讲解了用事件处理函数处理调试事件的方法。用 PyDbg 可以很容 易的扩展这种功能,只需要构建一个用户模式的回调函数。当收到一个调试事件的时候,回 调函数执行我们定义的操作。比如读取特定地址的数据,设置更更多的断点,操作内存。操 作完成后,再将权限交还给调试器,恢复被调试的进程。 PyDbg 设置函数的断点原型如下: bp_set(address, descr

  • 问题 使用CDI,我希望生成bean。 此外,我希望为注入点提供配置注释,例如: 我不想为的每个不同可能性编写一个单独的生产者。 方法 通常的方法是创建一个生产者并处理注入点注释: 因此,bean不能再被应用程序限定范围,因为每个注入点可能不同(producer的参数injectionpoint不适用于注释的生产者)。 所以这个解决方案不起作用。 问题 我需要具有相同值的注入点获得相同bean实例

  • 我们有一个应用程序,它使用Spring数据JPA存储库注入EJB。springframework。数据jpa。存储库。cdi。JpaRepositoryExtension发挥了神奇的作用。 它在CDI中查找EntityManager,保存以备后用,使用注释查找Spring Data JPA存储库,并保存它们的类型以备后用。当CDI初始化时,运行并执行正确的bean创建和插入CDI。这在JBoss