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

Quarkus extension - How to have an interceptor working on beans provided by the extension itself

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

但是扩展还提供了一些也被注释的@ApplicationScoped beans,但是拦截器没有拦截任何这些。

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

我想知道这是有意为之的行为,还是我的扩展程序设置中的问题,如果是的话如何解决。在文档中找不到关于此的任何内容,但是有太多的事情我可能错过了一些东西。

对此有什么想法吗?

我终于找到了一种方法来完成这项工作。

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

@ApplicationScoped
public class ProxyProducer {

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

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

}

使用以下 BeanA class(仅作为示例)

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 不支持拦截基于生产者的 bean。