我的
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 来说相当陌生,我不确定如何正确实施它。它也已经一年了,我想知道是否有比该邮件列表中建议的更好的实现。
是的,现在确实有更好的办法了。 Quarkus 配置由 SmallRye Config 实现。不幸的是,它不支持直接映射直接注入,但您可以使用此处记录的映射对象:https://smallrye.io/docs/smallrye-config/main/mapping/mapping.html
这是一个示例项目: https://github.com/smallrye/smallrye-config/tree/main/examples/mapping
所有这些都适用于 Quarkus。
您可以通过使用通过
@ConfigMapping
界面提供的配置映射来实现此目的。
由于您的具体案例涉及 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";
}
}