Kotlin spring-boot @ConfigurationProperties

Я пытаюсь создать следующий боб AmazonDynamoDBAsyncClientProvider, У меня есть application.properties, который определяет endpoint а также tablePrefix который я пытаюсь ввести с помощью @ConfigurationProperties

Ниже приведен фрагмент кода для того же. Когда я запускаю приложение с весенней загрузкой, оно не работает.

Я пытался сделать то же самое ConfigurationProperties класс с использованием обычного Java-класса, который устанавливает эти свойства, но когда дело доходит до AmazonDynamoDBAsyncClientProvider, свойства пусты. Что мне здесь не хватает?

@Component
open class AmazonDynamoDBAsyncClientProvider @Autowired constructor(val dynamoDBConfiguration: DynamoDBConfig){

@Bean open fun getAmazonDBAsync() = AmazonDynamoDBAsyncClientBuilder.standard()
        .withEndpointConfiguration(
                AwsClientBuilder.EndpointConfiguration(dynamoDBConfiguration.endpoint, dynamoDBConfiguration.prefix))
        .build()
}

вот бин kotlin, который я пытаюсь связать с конфигурацией

@Component
@ConfigurationProperties(value = "dynamo")
open class DynamoDBConfig(var endpoint: String="", var prefix: String="")

наконец, вот обычный боб Java, который заселяется ConfigurationProperties но когда это становится Autowired Я вижу эти свойства пустыми / нулевыми

@Component
@ConfigurationProperties("dynamo")
public class DynamoDBConfiguration {
private String endpoint;
private String tablePrefix;

public String getEndpoint() {
    return endpoint;
}

public void setEndpoint(String endpoint) {
    this.endpoint = endpoint;
}

public String getTablePrefix() {
    return tablePrefix;
}

public void setTablePrefix(String tablePrefix) {
    this.tablePrefix = tablePrefix;
}
}

1 ответ

Вы пытались избавиться от аннотации @Component в своем классе ConfigurationProperties?

Вот что я сделал с Kotlin и Spring, надеюсь, это поможет.

Я пытаюсь использовать плагин kotlin-spring и kotlin-allopen gradle

dependencies {
    classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlinVersion"
    classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlinVersion"
}
apply plugin: 'kotlin-spring'
apply plugin: 'kotlin-noarg'
noArg {
    annotation("your.noarg.annotation.package.NoArg")
}

Они действительно облегчают развитие весны с kotlin.

@ConfigurationProperties("dynamo")
@NoArg
data class DynamoDBConfiguration(var endpoint: String, var prefix: String)

Я попробовал ваш класс конфигурации, и он заполняется. Я думаю, что ваша ошибка заключается в том, что вы пытаетесь создать бин, функция должна быть в классе с пометкой @Configuration, это должно работать:

@Configuration
class Beans {
    @Bean
    fun getAmazonDBAsync(config: DynamoDBConfiguration) = 
        AmazonDynamoDBAsyncClientBuilder.standard()
        .withEndpointConfiguration(
            AwsClientBuilder.EndpointConfiguration(config.endpoint, config.prefix)
        )
        .build()
}

Spring будет вводить конфиг для вас, если вы аннотируете конфиг с помощью @Componentкак вы сделали выше.

У меня была аналогичная проблема, и я исправил ее следующим образом:

Я определил свойства конфигурации class с участием lateinit вары:

@ConfigurationProperties(prefix = "app")
open class ApplicationConfigProperties {
     lateinit var publicUrl: String
}

Затем настроил bean-компонент в моем приложении весенней загрузки:

@SpringBootApplication
open class Application {
     @Bean open fun appConfigProperties() = ApplicationConfigProperties()
}
Другие вопросы по тегам