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。
我正在开发一个 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。