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

Quarkus中豆类注射过程中的堆积溢出

楚勇
2023-03-14

我正试图在quarkus的启动活动中注入两种A级和B级钙。

public void init(@Observes StartupEvent startupEvent, ClassA a, ClassB b) throws Exception {
      
    }

课程:

public class ClassA {
    public ClassA() {

    }
}

public class ClassB {
    private final ClassA dependentClass;
    public ClassB(ClassA dependentClass) {
        this.dependentClass = dependentClass;
    }
}

这两个类的制作人如下所示:

@ApplicationScoped
public class Configuration {

    @Produces
    @Singleton
    public ClassA produceA() {
        return new ClassA();
    }

    @Inject
    @Produces
    @Singleton
    public ClassB produceB(ClassA dependentClass) {
        return new ClassB(dependentClass);
    }
}

结果,我收到堆栈溢出错误:

Caused by: java.lang.StackOverflowError
        at io.quarkus.arc.runtime.devconsole.InvocationInterceptor_Bean.create(Unknown Source)
        at io.quarkus.arc.runtime.devconsole.InvocationInterceptor_Bean.get(Unknown Source)
        at io.quarkus.arc.runtime.devconsole.InvocationInterceptor_Bean.get(Unknown Source)
        at org.acme.getting.started.Configuration_Subclass.<init>(Unknown Source)
        at org.acme.getting.started.Configuration_Bean.create(Unknown Source)
        at org.acme.getting.started.Configuration_Bean.create(Unknown Source)
        at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:96)
        at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:29)
        at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:26)
        at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26)
        at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
        at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:26)
        at io.quarkus.arc.impl.ClientProxies.getApplicationScopedDelegate(ClientProxies.java:18)
        at org.acme.getting.started.Configuration_ClientProxy.arc$delegate(Unknown Source)
        at org.acme.getting.started.Configuration_ClientProxy.arc_contextualInstance(Unknown Source)
        at org.acme.getting.started.Configuration_ProducerMethod_produceA_612e78438d1b1b670691525f250ee747f2210b1e_Bean.create(Unknown Source)
        at org.acme.getting.started.Configuration_ProducerMethod_produceA_612e78438d1b1b670691525f250ee747f2210b1e_Bean.create(Unknown Source)
        at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:96)
        at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:29)
        at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:26)
        at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26)
        at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
        at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:26)
        at org.acme.getting.started.Configuration_ProducerMethod_produceA_612e78438d1b1b670691525f250ee747f2210b1e_Bean.get(Unknown Source)
        at org.acme.getting.started.Configuration_ProducerMethod_produceA_612e78438d1b1b670691525f250ee747f2210b1e_Bean.get(Unknown Source)
        at org.acme.getting.started.Configuration_Bean.create(Unknown Source)
        at org.acme.getting.started.Configuration_Bean.create(Unknown Source)
        at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:96)
        at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:29)
        at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:26)
        at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26)
        at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
        at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:26)
        at io.quarkus.arc.impl.ClientProxies.getApplicationScopedDelegate(ClientProxies.java:18)
        at org.acme.getting.started.Configuration_ClientProxy.arc$delegate(Unknown Source)
        at org.acme.getting.started.Configuration_ClientProxy.arc_contextualInstance(Unknown Source)
        at org.acme.getting.started.Configuration_ProducerMethod_produceA_612e78438d1b1b670691525f250ee747f2210b1e_Bean.create(Unknown Source)
        at org.acme.getting.started.Configuration_ProducerMethod_produceA_612e78438d1b1b670691525f250ee747f2210b1e_Bean.create(Unknown Source)

请告诉我Quarkus支持这样的生产商吗?如果不能,在一个配置类中产生两个依赖类的解决方案是什么?我的目的是把所有的单例生产者放在一个地方,但是由于https://github.com/quarkusio/quarkus/issues/3241,单例范围不适用于主配置文件

共有1个答案

耿学义
2023-03-14

我不完全确定,但我相信您需要从produceB方法中删除@Injectannotation。生产者方法的参数是自动注入点,因此从这个角度来看,@Inject注释是不必要的。

更糟糕的是,@Inject注释实际上除了将参数指定为注入点之外还执行其他操作。它使该方法成为初始值设定项方法(这有时也称为 setter 注入)。这意味着,要完全构造配置的实例,CDI 容器必须调用 produceB 方法并向其传递 ClassA 的实例(初始值设定项方法的参数也是注入点)。但是,为了能够获得 ClassA 的实例,容器需要一个完全构造的配置实例。我相信,这是一个循环,会导致你观察到的堆栈溢出。

从技术上讲,该规范禁止对初始值设定项方法进行注释@Produces,因此这会导致在构建期间出错。我猜ArC(Quarkus中的CDI实现)没有正确检查这一点,这是一个错误。

 类似资料:
  • 我在EJB模块中有一个@Stateless bean 我在同一个EJB模块中有一个@Named bean Bar#hello是从Web模块中的CDI bean调用的。 由于某些原因,Bar并没有被注入到Foo中——它总是一个空引用。我希望这会奏效。

  • 我有以下数据集,并使用Matplotlib绘制了一个堆叠条形图。 以下是生成图形的代码: 我需要注释图形中的值。例如,我需要每个条的值出现在图形的条内。请参阅下面的示例

  • 我正在尝试实现一个基于运行时配置的Quarkus扩展,它提供了一个SecurityIdentityUggmentor。 部署: 我的处理器 运行时: 我的录音机: 在客户端应用程序中生成MyAugmentor实例的唯一方法是添加一个bean。扩展的运行时模块中的xml。但是我没有看到豆子。github repo中的其他扩展中的xml。有人能给我指一下正确的方向吗?

  • 我正在使用quarkus构建一个需要连接到MongoDB的应用程序。 https://quarkus.io/ 有一个关于hibernate和JPA的指南,但没有关于MongoDB的。 有人能做到吗?你能和我分享一个有例子的存储库吗?

  • 我想在注射过程中给CDI中的pojo bean一个移动范围。 我创建了一个普通的bean,并在托管Bean中注入了与相同的内容: //POJO类 当我使用相同的语法注入时,Pojo bean的填充值无法在新视图bean中恢复。 但是当我在类声明中使用时,它会起作用,然后是非作用域注入,如下所示: 注射: 前一种情况在我做制片人和资格赛时得到了解决,但我觉得这将是一种我不应该做的开销。作为CDI的新

  • 问题内容: 我正在尝试使用创建水平堆叠的条形图,但是我看不到如何使条形实际堆叠,而不是全部从y轴开始。 这是我的测试代码。 看到tcaswell的评论后,编辑使用kwarg。 这似乎是正确的方法,但是如果没有特定条形的数据,则尝试失败,因为它正尝试添加到随后返回的值。 问题答案: 由于您使用的是熊猫,因此值得一提的是,您可以在本地进行堆积条形图: 请参阅 文档的可视化部分。