Kotlin spring-boot @ConfigurationProperties

时间:2017-05-25 03:24:25

标签: spring-boot kotlin configurationproperty

我正在尝试创建以下bean AmazonDynamoDBAsyncClientProvider。我的application.properties定义了endpointtablePrefix,我试图使用@ConfigurationProperties

来注入

以下是相同的代码段。当我运行我的spring-boot应用程序时,它不起作用。

我尝试使用常规java类来执行相同的ConfigurationProperties类,该类设置了这些属性,但是当涉及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 bean
@Component
@ConfigurationProperties(value = "dynamo")
open class DynamoDBConfig(var endpoint: String="", var prefix: String="")

最后继续使用ConfigurationProperties填充的常规java bean,但是当它获得Autowired时,我看到这些属性为空/ null

@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;
}
}

3 个答案:

答案 0 :(得分:2)

您是否尝试过删除ConfigurationProperties类上的@Component注释?

以下是我对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)

答案 1 :(得分:0)

我尝试了您的配置类,并填充了它。我认为您的错误是您尝试创建Bean的方式,该功能必须位于带有@Configuration注释的类中,这应该可以工作:

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

只要您使用@Component注释配置,Spring就会像上面一样为您注入配置。

答案 2 :(得分:0)

我遇到了类似的问题,并通过以下方式解决了这个问题:

我用class变量定义了配置属性lateinit

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

然后在我的spring boot应用程序中配置一个bean:

@SpringBootApplication
open class Application {
     @Bean open fun appConfigProperties() = ApplicationConfigProperties()
}