【问题标题】:How to use configuration maps for custom Quarkus ConfigProperties如何为自定义 Quarkus ConfigProperties 使用配置映射
【发布时间】:2020-05-18 15:20:25
【问题描述】:

对于我的 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 扩展?

【问题讨论】:

    标签: java properties-file quarkus microprofile


    【解决方案1】:

    正如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
    

    【讨论】:

      【解决方案2】:

      像这样声明配置

      import io.quarkus.arc.config.ConfigProperties;
      
      @ConfigProperties(prefix = "myapp")
      public class AppSpecificConfig {
      
          public String property;
      
      }
      

      application.properties 文件将包含

      myapp.property=foo
      

      然后您可以在应用程序中的任何位置@Inject 此类的实例。

      更多详情请见https://quarkus.io/guides/config#using-configproperties

      【讨论】:

      • 您好@Jan Martiška,谢谢您的回复。简单属性的定义和注入是明确的。我正在寻找一种使用 java.util.Map 设置命名配置的方法。在我在问题中提供的示例中,我尝试告诉 quarkus 使用字符串 anystring 作为键将带有 myProperty = bar 的新 FooConfiguration 项目放到地图 foo 上。
      • 啊,那我认为不,该设施目前仅用于扩展。还有另一种选择,如果你真的想注入映射,你可以创建一个org.eclipse.microprofile.config.spi.Converter&lt;Map&gt;,但是那个只能将一个配置属性映射到一个Map对象,这意味着该属性必须包含所有键和特定可解析格式的值。
      • @JanMartiška 你有一个例子如何为地图创建和注册这样的转换器吗?
      • @stinger 尝试按照quarkus.io/guides/config#custom-configuration-converters 的指南进行操作,但您将使用Map&lt;String, String&gt; 而不是MicroProfileCustomValue
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 2023-02-15
      • 2012-01-20
      • 2013-07-31
      相关资源
      最近更新 更多