对于我的 Quarkus 应用程序,我正在寻找一种从自定义 ConfigProperties 类中定义配置映射的方法。我尝试了以下方法:
import io.quarkus.arc.config.ConfigProperties;
import io.quarkus.runtime.annotations.ConfigItem;
@ConfigProperties(prefix = "my-properties")
public class MyPropertiesConfiguration {
@ConfigItem
public Map<String, FooConfiguration> foo;
// ...
}
import io.quarkus.runtime.annotations.ConfigGroup;
import io.quarkus.runtime.annotations.ConfigItem;
@ConfigGroup
public class FooConfiguration {
@ConfigItem
public String myProperty;
}
鉴于这两个类和以下 application.properties 文件...
my-properties.foo.anystring.my-property=bar
启动时应用程序失败并显示错误消息:
javax.enterprise.inject.spi.DeploymentException: No config value of type [java.util.Map] exists for: my-properties.foo
据我了解 https://quarkus.io/guides/writing-extensions#configuration-maps 样本应该可以工作。我究竟做错了什么?这个功能是否仅限于 Quarkus 扩展?
最佳答案
正如此 Quarkus github issue 中所写,目前不支持此功能。
我肮脏的解决方法是直接使用 ConfigProvider
。小心使用。
public static Map<String, String> getMapFromConfig(String prefix) {
final Config config = ConfigProvider.getConfig();
final Iterable<String> propertyNames = config.getPropertyNames();
return StreamSupport.stream(propertyNames.spliterator(), false)
.filter(name -> name.startsWith(prefix) && !name.equalsIgnoreCase(prefix))
.collect(
Collectors.toMap(
propertyName -> cleanupPropertyName(propertyName.substring(prefix.length() + 1)),
propertyName -> config.getOptionalValue(propertyName, String.class).orElse("")));
}
/** Remove start and end double quotes */
public static String cleanupPropertyName(String name) {
if (name.startsWith("\"") && name.endsWith("\"")) {
return name.substring(1, name.length() - 1);
}
return name;
}
我的配置是这样的:property-templates:
"my.key": value 1
"my.second.key": value 2
关于java - 如何为自定义 Quarkus ConfigProperties 使用配置映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61872993/