gpt4 book ai didi

java - 无法使用动态属性键将应用程序属性映射到对象

转载 作者:行者123 更新时间:2023-12-02 09:08:19 24 4
gpt4 key购买 nike

我正在尝试按值获取应用程序属性对象,我已经在 J​​ava 中做到了这一点,但由于某种原因使用 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

所以你可以看到汽车标识符(奥迪、宝马、标致等)是动态的,我只需通过序列值来获取代表特定汽车的对象,并通过汽车 key (奥迪、宝马)来获取所有其他属性。

我所做的很简单,我创建了这样的配置属性类:

@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 的情况下它不起作用,我可能犯了一些非常基本的错误,如果有人能解释这里发生的事情,我将非常感激

最佳答案

好的,我明白了。据此:https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/boot-features-kotlin.html对您想要的支持非常有限。

我让它像那样工作 - 不太好:-( :

@ConfigurationProperties(prefix = "ee.car")
class FesEngineKeyProperties() {

var config: MutableMap<String, EeCarConfigParam?>? = mutableMapOf()

fun getBase(serial: String): String {
if(config == null) return ""
return config!!["audi"]?.base ?: ""
}
}


class EeCarConfigParam() {
lateinit var serial: String
lateinit var base: String
}

@SpringBootApplication
@EnableConfigurationProperties(FesEngineKeyProperties::class)
class SandboxApplication

fun main(args: Array<String>) {
runApplication<SandboxApplication>(*args)
}

关于java - 无法使用动态属性键将应用程序属性映射到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59620942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com