2

我正在尝试创建以下 bean AmazonDynamoDBAsyncClientProvider。我有 application.properties 定义endpointtablePrefix我试图注入使用@ConfigurationProperties

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

我尝试过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 bean

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

最后继承了确实填充的常规java bean,ConfigurationProperties但是当它得到时,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;
}
}
4

3 回答 3

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 的 Spring 开发变得更加容易。

@ConfigurationProperties("dynamo")
@NoArg
data class DynamoDBConfiguration(var endpoint: String, var prefix: String)
于 2017-07-25T09:51:03.077 回答
0

我有一个类似的问题并以这种方式修复它:

class我用lateinitvars定义了配置属性:

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

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

@SpringBootApplication
open class Application {
     @Bean open fun appConfigProperties() = ApplicationConfigProperties()
}
于 2020-01-15T14:05:02.710 回答
0

我试过你的配置类,它被填充了。我认为您的错误在于您尝试创建 bean 的方式,该函数需要在一个用 注释的类中@Configuration,这应该可以工作:

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

Spring 将为您注入配置,只要您使用 注释配置@Component,就像您在上面所做的那样。

于 2018-12-19T06:29:20.300 回答