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

Quarkus扩展 - 如何让拦截器处理扩展本身提供的 bean

翁建弼
2023-03-14

我正在开发一个Quarkus扩展,它提供了一个拦截器(及其注释),以围绕此扩展提供的业务方法添加一些重试逻辑。这里没有什么新内容,当我在使用此扩展的应用程序中注释bean的公共方法时,这是有效的。

但是该扩展还提供了一些也带注释的@ApplationScoped bean,但拦截器没有拦截其中任何一个。

似乎拦截器不会检查/应用扩展本身。

我想知道这是有意的行为,还是我的扩展设置中的问题,如果是,如何修复它。在留档中找不到任何关于此的信息,但有太多事情要做,我可能错过了一些东西。

对这个有什么想法吗?

共有1个答案

唐彬炳
2023-03-14

我终于找到了一个办法来实现这个目标。

我使用生产者bean模式将我的beam生成为扩展中的@ApplicationScopedbean。

@ApplicationScoped
public class ProxyProducer {

  @Produces
  @ApplicationScoped
  public BeanA setUpBean(ExtensionConfig config) 
  {

    return new BeamsClientProxy(new InternalBean(config.prop1, config.prop2));
  }

}

使用下面的BeanA类(只是一个示例)

public class BeanA {

  private final InternalBean innerBean;

  public BeanA(final InternalBean innerBean) {
    this.innerBean = innerBean;
  }

  @MyInterceptedAnnotation
  public void doSomething() {
  }
}

由于这种设置,拦截器不会考虑这个bean(我猜是因为它只在第一次被使用/注入到其他地方时才会产生)

移除生产者模式并直接注释BeanA修复了该问题。示例:

@ApplicationScoped
public class BeanA {

  private final InternalBean innerBean;

  public BeanA(final ExtensionConfig config) {
    this.innerBean = new InternalBean(config.prop1, config.prop2);
  }

  @MyInterceptedAnnotation
  public void doSomething() {
  }
}

当然,添加以下行以直接在扩展处理器上注册bean:

@BuildStep
AdditionalBeanBuildItem proxyProducer() {
    return AdditionalBeanBuildItem.unremovableOf(BeanA.class);
}

总结如下:

  • 更改bean实现以避免基于生产者的bean用例解决了我的问题(请参阅下面的Ladicek评论)

编辑:正如Ladicek所解释的那样,Quarkus不支持拦截基于生产者的豆子。

 类似资料:
  • 扩展说明 服务提供方和服务消费方调用过程拦截,Dubbo 本身的大多功能均基于此扩展点实现,每次远程方法执行,该拦截都会被执行,请注意对性能的影响。 约定: 用户自定义 filter 默认在内置 filter 之后。 特殊值 default,表示缺省扩展点插入的位置。比如:filter="xxx,default,yyy",表示 xxx 在缺省 filter 之前,yyy 在缺省 filter 之后

  • 问题内容: 我已从提供回调来跟踪提交给的任务的执行。 现在,我看到的是任务是否已提交,但最终进入队列,并且任务仍被调用(方法仍然被调用),并且(可能)检查任务已取消且未调用包装的可调用对象。 我应该做例如 还是应该打电话给我?在检查取消和对其进行任何操作之间,这两种方法似乎都容易受到比赛条件的影响。 问题答案: 您说对了,那是对的。系统 最多 会调用 一次 ,因此如果任务在通过运行之前已被取消,您

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

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

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

  • 问题内容: 我正在尝试扩展Python,以用于越野比赛的结果。我想从格式为string的对象构造一个对象。我可以使用工厂设计模式和注释来完成此操作。我将如何通过覆盖和/或完成相同的任务? 使用下面的代码,构造一个对象会引发TypeError。请注意,未调用,因为未打印。 这是错误: 如果将代码从移至,则会得到以下结果。注意这次,输出显示我的函数被调用了。 问题答案: 显然,对象是不可变的,这意味着