Quarkus 在 Maven 打包阶段检查 Bean 注入点,导致类型依赖性不满足

问题描述 投票:0回答:1

我开发了一个扩展,它提供带有 SyntheticBeanBuildItem 的 Injectable bean。 该 bean 通过构造函数注入到另一个使用此扩展的项目中使用。

/**
* Bean to inject
*/
@ApplicationScoped
public class FooConfig {

    private String url;
    private String port;

    // Only for CDI injection
    @SuppressWarnings("unused")
    private FooConfig() {}

    public FooConfig(String url, String port) {
        this.url = url;
        this.port = port;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getPort() {
        return port;
    }

    public void setPort(String port) {
        this.port = port;
    }
}
@Path("")
public class Foo {

    private final FooService fooService;
    private final FooConfig fooConfig;

    public Foo(FooService fooService, FooConfig fooConfig) {
        this.fooService = fooService;
        this.myConfig = fooConfig;
    }

    @CheckedTemplate
    public static class Templates {
        public static native TemplateInstance index();
        public static native TemplateInstance list(Uni<List<Bar>> bars, FooConfig fooConfig);
    }

    @GET
    @Produces(MediaType.TEXT_HTML)
    public TemplateInstance list() {
        return Templates.list(fooService.fetchAsync(), this.fooConfig);
    }
}

这是提供 FooConfig bean 的扩展代码:

@Record(ExecutionTime.RUNTIME_INIT)
@BuildStep
public void createConfigBean(List<DevServicesResultBuildItem> devServicesResultBuildItem, FooRecorder recorder, BuildProducer<SyntheticBeanBuildItem> syntheticBeanBuildItemBuildProducer) {
        // Retrieve config set Inside FooExtensionProcessor
        String apiUrl = devServicesResultBuildItem.stream().filter(devService -> devService.getName().equals(FooServiceContainer.CONTAINER_NAME))
                .findFirst()
                .orElseThrow(() -> new IllegalStateException("Can't find foo-service url"))
                .getConfig().get("url");
        syntheticBeanBuildItemBuildProducer.produce(SyntheticBeanBuildItem.configure(FooConfig.class)
                .unremovable()
                .setRuntimeInit()
                .runtimeValue(recorder.createConfig("http://"+apiUrl))
                .done());
}

还有录音机:

@Recorder
public class FooServiceRecorder {

    public RuntimeValue<FooConfig> createConfig(String url) {
        return new RuntimeValue<>(new FooConfig(url, url.split(":")[1]));
    }
}

如果我在项目中运行

quarkus dev
,一切都会按预期进行。正确找到并注入了 Bean。如果我从父项目中运行
mvn compile
,一切都会好起来。

但是,如果我运行

mvn package
,Quarkus maven 插件接缝会检查 bean 可用性,所以我收到此错误:

Suppressed: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.baz.foo.extension.runtime.FooConfig and qualifiers [@Default]

对我来说,quarkus 插件不应该尝试在打包阶段验证注入,或者考虑使用 SyntheticBeanBuildItem 生成的 beans。

我错过了什么,还是插件中的错误?

java maven quarkus cdi quarkus-extension
1个回答
0
投票

您的构建步骤似乎消耗了

DevServicesResultBuildItem
列表。但是,这些项目仅在开发模式下可用,即在
mvn package
期间不可用。因此,我希望您的构建步骤会失败,并显示
IllegalStateException

完整的堆栈跟踪是什么样的?

© www.soinside.com 2019 - 2024. All rights reserved.