我希望有人可以帮助我理解这个错误。
我在使用 @ConfigurationProperties 记录时遇到问题: 当我启动应用程序时,出现此错误:
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'environmentConstants' defined in file [C:\Workspace-IntelliJ\TEST\record-configuration-properties-test\target\classes\it\test\recordconfigurationpropertiestest\model\EnvironmentConstants.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
在带有 Java 17 的 Springboot 3.2.4 中,我一直在寻找从 application.yml 公开配置值的正确方法。
我需要一种比使用 @Value 注释更干净的方式来公开它们并且不可变。
我发现可以使用 @ConfigurationProperties 注释和记录,因此为了尝试它,我使用 spring 初始化程序创建了一个新的 spring 项目,其唯一依赖项是 spring-boot-starter、spring-boot-starter-test 和 lombok。
然后我创建了我的配置:
我的应用程序.yml:
app:
constants:
my-constant: 'MyValue'
和我的记录:
@ConfigurationProperties("app.constants")
@Component
public record EnvironmentConstants (
String myConstant){
}
并且我期望,就像教程所说的那样,能够在任何地方使用它,所以我创建了一个这样的测试:
我的测试:
@SpringBootTest
@Slf4j
class ConfigurationTest {
@Autowired
private EnvironmentConstants environmentConstants;
@Test
void test(){
log.info("TEst: {}", environmentConstants.myConstant());
}
}
我还尝试了一些不同的配置,但没有一个能正常工作。 首先:我尝试像这样修改 application.yml 中的配置:
app:
environment-constants:
my-constant: 'MyValue'
第二:我尝试在应用程序类或测试类中使用
@EnableConfigurationProperties
和@ConfigurationPropertiesScan
。<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
我找到了很多关于此的文档,但在我看来我做得正确,那么为什么它不起作用?
当您尝试
@EnableConfigurationProperties
和@ConfigurationPropertiesScan
时,您已经很接近了。除了使用其中之一之外,您还需要从 @Component
中删除 EnvironmentConstants
。
@Component
的问题在于,它会导致EnvironmentConstants
被创建为常规Spring bean,然后需要为其String
参数注入myConstant
bean。
如果删除
@Component
,则 EnvironmentConstants
实例将仅创建为 @ConfigurationProperties
bean。 myConstant
的值将是您的 app.environment-constants.my-constant
财产的值。