Невозможно отобразить свойства приложения на объект с ключом свойства Dynami c. - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь получить объект свойства приложения по значению, я уже сделал это в 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

, так что вы можете видеть идентификаторы автомобилей (audi, bmw, peugeot, et c .. ) являются Dynami c, и мне нужно просто по серийному значению, чтобы получить объект, который представляет конкретную c машину, и по ключу автомобиля (Audi, BMW), чтобы получить все другие свойства.

И что я сделал просто, я создал класс свойств конфигурации следующим образом:

@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"])
    }

А затем объект для сопоставления ключей после динамического c значения:

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()

, тогда я вижу, что параметр config заполняется всеми значения.

Этот код уже работает в 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 он не работает, я вероятно, допустил очень грубую ошибку c, и я бы очень признателен съел, если кто-нибудь может объяснить, что здесь происходит

Ответы [ 2 ]

1 голос
/ 08 января 2020

Хорошо, я понял. В соответствии с этим: 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)
}
0 голосов
/ 04 февраля 2020

Я смог справиться с этой проблемой, она как-то связана с kotlin, потому что однажды, когда я вместо этого:

data class EeCarConfigParam {
        var serial: String,
        var base: String
}

использовал класс "norma" Java, все начало работать, поэтому весь код из моего вопроса остается прежним, единственное отличие заключается в следующем: вместо Kotlin EeCardConfigParam я создал Java класс, подобный этому:

public class EeCarConfigParam {
    private String publicUrl;
    private String base;
}

Примечание: со всеми получателями по умолчанию, сеттерами, равно, ha sh и методы toString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...