我开发了一个扩展,它提供带有 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。
我错过了什么,还是插件中的错误?
您的构建步骤似乎消耗了
DevServicesResultBuildItem
列表。但是,这些项目仅在开发模式下可用,即在 mvn package
期间不可用。因此,我希望您的构建步骤会失败,并显示 IllegalStateException
。
完整的堆栈跟踪是什么样的?