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