Java 无法将应用程序属性映射到具有动态属性键的对象

Java 无法将应用程序属性映射到具有动态属性键的对象,java,spring-boot,kotlin,Java,Spring Boot,Kotlin,我试图通过值获取应用程序属性对象,我已经在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 =

我试图通过值获取应用程序属性对象,我已经在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"])
    }
@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;
}
public class EeCarConfigParam {
    private String publicUrl;
    private String base;
}
因此,正如您所看到的,汽车标识符(奥迪、宝马、标致等)是动态的,我只需要通过序列值获取表示特定汽车的对象,并通过汽车钥匙(奥迪、宝马)获取所有其他属性

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

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"])
    }
@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;
}
public class EeCarConfigParam {
    private String publicUrl;
    private String base;
}
但这里的问题是,在FesEngineKeys类中,config属性为空,看起来EeCarConfigParam无法映射

另一个有趣的部分是当我改变时:

val config: HashMap<String, EeCarConfigParam> = HashMap() to
val config: HashMap<String, String> = HashMap()
val-config:HashMap=HashMap()到
val config:HashMap=HashMap()
然后我可以看到config param中填充了所有的值

此代码已在Java中运行,如下所示:

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"])
    }
@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;
}
public class EeCarConfigParam {
    private String publicUrl;
    private String base;
}
@配置
@吸气剂
@塞特
@配置属性(前缀=“ee.car”)
公共类FESEngineKeys{
private Map config=new HashMap();
公共EeCarConfigParam getOrDefaultEEConfig(字符串引擎键){
return config.getOrDefault(engineKey,config.get(“奥迪”));
}
公共EeCarConfigParam findBySerial(字符串序列){
返回config.values().stream().filter(cfg->cfg.getSerial().equalsIgnoreCase(serial)).findFirst().orElse(null);
}
}
@资料
公共类EeCarConfigParam{
私有字符串序列;
私有字符串基;
}
我真的不知道为什么在Kotlin的案例中它不起作用,我可能犯了一些基本的错误,如果有人能解释这里发生了什么,我将非常感激。 根据这一点:对你想要的东西的支持是非常有限的

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

@ConfigurationProperties(prefix=“ee.car”)
类FesEngineKeyProperties(){
变量配置:MutableMap?=mutableMapOf()
fun getBase(序列号:String):String{
如果(配置==null)返回“”
返回配置!![“奥迪”]?.base:“”
}
}
类EeCarConfigParam(){
lateinit变量序列:字符串
lateinit var基:字符串
}
@SpringBoot应用程序
@EnableConfigurationProperties(FesEngineKeyProperties::类)
类沙盒应用程序
趣味主线(args:Array){
运行应用程序(*args)
}

我能够处理这个问题,它在某种程度上与kotlin有关,因为有一次我没有处理这个问题:

data class EeCarConfigParam {
        var serial: String,
        var base: String
}
使用“norma”Java类,一切都开始工作,所以我的问题中的所有代码都保持不变,唯一的区别是:我创建了如下Java类,而不是Kotlin EeCardConfigParam:

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"])
    }
@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;
}
public class EeCarConfigParam {
    private String publicUrl;
    private String base;
}

注意:使用所有默认的getter、setter、equals、hash和toString方法。

我要注意两件事:首先使EeCarConfigParam成为一个数据类(用于equals和hashcode)…第二,在kotlin中,映射被注入,而在java中,映射是一个属性..将映射更改为属性?我猜映射是spring的默认值,可以被注入。这只是猜测,也许我错了,它已经是数据类了,我的错误,我没有将其包括在内(现在已编辑)。将映射更改为属性是什么意思?请举个例子好吗?数据类FesEngineKeys(){private val config:HashMap=HashMap()…仍然无法将配置映射公开?感谢您的努力和帮助,但我能够以更简洁的方式完成此操作,基本上我所做的是,我创建了“normal”Java类而不是Kotlin类,并且一切都正常工作,没有任何额外或特殊的代码,明天我将粘贴我的解决方案,有人可能会发现它很有用。