java - 如何为自定义 Quarkus ConfigProperties 使用配置映射
问题描述
对于我的 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 问题中所写,目前不支持此功能。
我肮脏的解决方法是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
推荐阅读
- azure - 阅读所有注册 azure notification hub python
- spring - 消息处理在 Spring 集成中随机暂停/暂停一小段时间
- javascript - 如何从一个html页面重定向到另一个html
- html - 使用属性在 HTML 中定位链接
- c++ - 非模板类中模板方法中的dll和静态变量
- elasticsearch - 字段总和的Elasticsearch(ELK堆栈)划分
- tomcat - 用 okhttp 3.81 看到很多 CLOSE_WAIT
- svn - 我可以 SVN 结帐到包含文件的目录吗?
- .net-standard - .Net 标准项目依赖项
- apache - Websocket 在 Chrome 上连接,但在 Firefox 上没有