spring-boot - 在@Configuration 类中使用配置属性
问题描述
是否期望配置属性类应该在@Configuration
类中可用。
环境
- 春季启动 2.0.2
- java版本“10.0.1” 2018-04-17 Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10), Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, 混合模式)
- OSX 10.13.4
我的代码
应用程序-local.properties:
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
带有字符串注释的方法参数。
这是预期的行为还是可能是错误?
解决方案
在您的情况下,没有必要使用@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();
...
}
}
注释@Configuration
将类注册为 bean,并允许您将其注入另一个 bean。
推荐阅读
- python - 如何将文件读入包含行号的元组列表中?
- ruby-on-rails - Rails - 如何根据最新的儿童添加列出父母?
- javascript - 机器人不能在 IRC 上工作,用 Node.js 编写
- r - fable::forecast 中的索引类
- python - mpmath.nsum() 中的 lambda 有什么替代方法吗?
- javascript - 我可以只使用 JavaScript 和一个按钮元素来更改整个网站(2 页)上的所有图片吗?
- regex - 对可选 ex 的反向引用
- python - 在另一个线程中编辑抽象模型后如何正确更新 pyQt 中的视图?
- ios - SwiftUI:如何在 macOS 中使用 NavigationView?
- android - 如何从节点服务器发送 Firebase 推送通知