Java 17 Record 和 ConfigurationProperties 不起作用

问题描述 投票:0回答:1

我希望有人可以帮助我理解这个错误。

我的问题

我在使用 @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>

我找到了很多关于此的文档,但在我看来我做得正确,那么为什么它不起作用?

类似例子:

StackOverflow 旧讨论
Baeldung指南

java spring spring-boot configuration record
1个回答
0
投票

当您尝试

@EnableConfigurationProperties
@ConfigurationPropertiesScan
时,您已经很接近了。除了使用其中之一之外,您还需要从
@Component
中删除
EnvironmentConstants

@Component
的问题在于,它会导致
EnvironmentConstants
被创建为常规Spring bean,然后需要为其
String
参数注入
myConstant
bean。

如果删除

@Component
,则
EnvironmentConstants
实例将仅创建为
@ConfigurationProperties
bean。
myConstant
的值将是您的
app.environment-constants.my-constant
财产的值。

© www.soinside.com 2019 - 2024. All rights reserved.