是否应该在@Configuration
类中使用配置属性类。
s3.bucketName=test-bucket
@Validated
@ConfigurationProperties(prefix = "s3")
public class S3ConfigurationProperties {
@NotBlank
private String bucketName;
public String getBucketName() {
return bucketName;
}
public void setBucketName(final String bucketName) {
this.bucketName = bucketName;
}
}
@Configuration
@Profile("local")
@EnableConfigurationProperties(S3ConfigurationProperties.class)
public class LocalS3Configuration {
@Autowired
private S3ConfigurationProperties properties;
@Value("${s3.bucketName}")
private String bucket;
@Bean(destroyMethod = "shutdown")
public AmazonS3 amazonS3(@Value("${local.s3.endpoint}") final String s3Endpoint, @Value("${s3.bucketName}") final String bucketName) {
// use properties...
final String bucketInjectedToMethod = bucketName; // works
final String bucketInjectedViaProperties = properties.getBucketName(); // null
final String bucketInjectedInClass = bucket; // null
}
}
如果我将S3ConfigurationProperties
作为字段注入配置类或amazonS3
方法的参数,则实例为non-null
,但其中的bucketName
属性为null
。
通过@Value
将字符串注入课程也是null
。
我能让它工作的唯一方法是使用带有字符串的注释为@Value
的方法参数。
这是预期的行为还是可能是错误?
答案 0 :(得分:2)
在您的情况下,没有必要使用Topic
。您可以将@EnableConfigurationProperties
放入@Configuration
:
S3ConfigurationProperties
所以,现在你可以将它注入@Configuration
@ConfigurationProperties(prefix = "s3")
public class S3ConfigurationProperties {
private String bucketName;
//getter and setter
}
:
LocalS3Configuration
注释@Profile("local")
@Configuration
public class LocalS3Configuration {
@Autowired
private S3ConfigurationProperties properties;
@Value(("${s3.bucketName}"))
private String bucketName;
@Bean(destroyMethod = "shutdown")
public AmazonS3 amazonS3() {
final String bucketInjectedToMethod = bucketName;
final String bucketInjectedViaProperties = properties.getBucketName();
...
}
}
将类注册为bean,并允许您将其注入另一个bean。