【发布时间】:2020-01-07 01:10:56
【问题描述】:
我正在尝试按值获取应用程序属性对象,我已经在 Java 中这样做了,但由于某种原因使用 Kotlin 我无法做到。
所以基本上我所拥有的是如下所示的应用程序属性列表:
ee.car.config.audi.serial=1
ee.car.config.audi.base=platform1
ee.car.config.bmw.serial=2
ee.car.config.bmw.base=platform2
所以你可以看到汽车标识符(奥迪、宝马、标致等)是动态的,我只需要通过序列值来获取代表特定汽车的对象并通过汽车钥匙(奥迪、宝马)来获取所有其他属性。
我所做的很简单,我创建了这样的配置属性类:
@Configuration
@ConfigurationProperties(prefix = "ee.car")
data class FesEngineKeys(
val config: HashMap<String, EeCarConfigParam> = HashMap()
) {
fun getOrDefaultEEConfig(engineKey: String): EeCarConfigParam? {
return config.getOrDefault(engineKey, config["audi"])
}
然后对象映射到动态值后的键:
data class EeCarConfigParam {
var serial: String,
var base: String
}
但这里的问题是,在 FesEngineKeys 类中,config 属性为空,看起来 EeCarConfigParam 无法映射。
另一个有趣的部分是当我改变时:
val config: HashMap<String, EeCarConfigParam> = HashMap() to
val config: HashMap<String, String> = HashMap()
然后我可以看到配置参数填充了所有值。
这段代码已经在 Java 中运行,看起来像这样:
@Configuration
@Getter
@Setter
@ConfigurationProperties(prefix = "ee.car")
public class FESEngineKeys {
private Map<String, EeCarConfigParam> config = new HashMap<>();
public EeCarConfigParam getOrDefaultEEConfig(String engineKey) {
return config.getOrDefault(engineKey, config.get("audi"));
}
public EeCarConfigParam findBySerial(String serial) {
return config.values().stream().filter(cfg -> cfg.getSerial().equalsIgnoreCase(serial)).findFirst().orElse(null);
}
}
@Data
public class EeCarConfigParam {
private String serial;
private String base;
}
我真的不知道为什么在 Kotlin 案例中它不起作用,我可能犯了一些非常基本的错误,如果有人能解释这里发生的事情,我将不胜感激
【问题讨论】:
-
两件事,我会照顾:首先让 EeCarConfigParam 成为一个数据类(用于等于和哈希码).. 第二个在 kotlin 中注入地图,而在 java 中它是一个属性.. 改变地图财产?我猜 Map
是 spring 默认值,可以注入。这只是猜测,也许我错了 -
它已经是数据类,我的错误我没有包括有问题的(现在已编辑)。你是什么意思改变 map 到 property ?可以举个例子吗?
-
数据类 FesEngineKeys() { private val config: HashMap
= HashMap() .... -
还是不行
-
公开配置映射?
标签: java spring-boot kotlin