java - 如何为自定义 Quarkus ConfigProperties 使用配置映射

标签 java properties-file quarkus microprofile

对于我的 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/

相关文章:

java - GMaven 构建失败并显示 "An API incompatibility was encountered"

java - 如何验证读取 1,000 到 999,999 范围内的数字输入的代码?

java - 单击按钮时增加一个值并使用该值更新文本字段

spring - 原始类型的属性不允许使用“lateinit”修饰符 - Kotlin

java - 如何使用 Quarkus/RestAssured 仅为一个测试用例注入(inject)模拟

java - 所有 KeyCloak Admin API 调用上的 NullPointerException

java - Eclipse 不会读取配置文件

java - 如何在运行时重新加载不属于 jar 的 application.properties

native 编译中不使用 Quarkus 配置文件感知配置

javafx - 使用 Quarkus 或 Springboot 和 JavaFx 进行 native 可执行文件