在 Quarkus 中读取带有属性映射的配置文件

问题描述 投票:0回答:2

我的

application.yaml
有一个存储在 yaml 文件中的值映射。

app:
  myMap:
    key1: value1
    key2: value2
    key3: value3

配置类:

@Data
@ApplicationScoped
public class AppConfiguration {

    @ConfigProperty(name = "app.myMap")
    private Map<String, String> myMap;
}

这会导致以下错误:

javax.enterprise.inject.spi.DeploymentException: No config value of type [java.util.Map] exists for: app.myMap

我无法读取这些值,因为 MicroProfile 不支持

java.util.Map
。我发现这个邮件列表建议了一种解决方法,但对于 Quarkus 来说相当陌生,我不确定如何正确实施它。它也已经一年了,我想知道是否有比该邮件列表中建议的更好的实现。

java yaml quarkus microprofile
2个回答
2
投票

是的,现在确实有更好的办法了。 Quarkus 配置由 SmallRye Config 实现。不幸的是,它不支持直接映射直接注入,但您可以使用此处记录的映射对象:https://smallrye.io/docs/smallrye-config/main/mapping/mapping.html

这是一个示例项目: https://github.com/smallrye/smallrye-config/tree/main/examples/mapping

所有这些都适用于 Quarkus。


0
投票

您可以通过使用通过

@ConfigMapping
界面提供的配置映射来实现此目的。

使用 YAML 配置

由于您的具体案例涉及 YAML,因此您可以执行以下操作...

代码

首先,确保您不要忘记提供相应的依赖项以启用 YAML 配置:

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-config-yaml</artifactId>
</dependency>

您要应用的配置是

application.yaml
:

app:
  myMap:
    key1: value1
    key2: value2
    key3: value3

各自的配置映射可以这样实现:

@ConfigMapping(prefix = "app")
public interface AppConfig {

    @WithName("myMap")
    Map<String, String> myMap();
}

在代码中调用配置就很简单了,例如:

@Path("/ping")
public class PingResource {

    @Inject
    AppConfig appConfig;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String ping() {
        String v1 = appConfig.myMap().get("key1");
        String v2 = appConfig.myMap().get("key2");
        String v3 = appConfig.myMap().get("key3");
        return "Values: [" + v1 + ":" + v2 + ":" + v3 + "]\n";
    }
}

使用
application.properties
文件

如果您想使用

application.properties
,请执行以下操作...

代码

如果您想使用

application.properties
,我们不需要
quarkus-config-yaml
Maven 依赖。

application.properties
则变为:

app.myMap.key1=value1
app.myMap.key2=value2
app.myMap.key3=value3

配置映射的代码保持相同:

@ConfigMapping(prefix = "app")
public interface AppConfig {

    @WithName("myMap")
    Map<String, String> myMap();
}

...以及获取它的逻辑:

@Path("/ping")
public class PingResource {

    @Inject
    AppConfig appConfig;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String ping() {
        String v1 = appConfig.myMap().get("key1");
        String v2 = appConfig.myMap().get("key2");
        String v3 = appConfig.myMap().get("key3");
        return "Values: [" + v1 + ":" + v2 + ":" + v3 + "]\n";
    }
}

参考

https://quarkus.io/guides/config-yaml

https://quarkus.io/guides/config-mappings

© www.soinside.com 2019 - 2024. All rights reserved.