我正在迁移到Spring Boot 3。在Spring Boot 2中,Resilience4J Retry是自动配置的,并使用以下设置开箱即用:
application.yaml:
resilience4j.retry:
instances:
some-instance
# retry config here
测试类:
@SpringBootTest
public class TestClass {
@Autowired
private RetryRegistry retryRegistry;
@Test
void someTest() {
// perform test and evaluate retries using retryRegistry
}
}
但是,当使用以下版本更新到Spring Boot 3时:
org.springframework.boot:spring-boot-starter:jar:3.0.0:compile
io.github.resilience4j:resilience4j-spring-boot2:jar:1.7.0:compile (derived from a Spring BoM)
自动连接RetryRegistry的测试失败,出现以下消息:
Unsatisfied dependency expressed through field 'retryRegistry':
No qualifying bean of type 'io.github.resilience4j.retry.RetryRegistry' available:
expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
我设法通过在测试中显式导入Resilience4j Retry配置来修复测试,使用:
@Import(io.github.resilience4j.retry.autoconfigure.RetryAutoConfiguration.class)
然而,我想知道为什么Spring Boot 3中的组件扫描机制一开始没有选择重试配置。有人知道为什么Spring Boot 3在组件扫描时没有选择这个类吗?
在resilience4j项目中,他们更改了spring boot 3的依赖项。
所以你应该去io.github.resilience4j:resilience4j-spring-boot3:${resilience4jVersion}
org.springframework.boot:spring-boot-starter:jar:3.0.0:compile
io.github.resilience4j:resilience4j-spring-boot3:jar:2.0.0:compile
从文档
这似乎与使用新的META-INF文件而不是旧的spring.factories
文件有关。来自文档:
Spring Boot 2.7引入了一个新的META-INF/Spring/org.springframework.boot.autoconfigure.AutoConfiguration。导入用于注册自动配置的文件,同时保持与spring.factories中的注册的向后兼容性。在这个版本中,支持在spring中注册自动配置。工厂已被删除,取而代之的是导入文件。
在spring-cloud-dependencies-parent
BoM中使用的Resilience4J依赖项仍然使用spring.factories
文件而不是名为org.springframework.boot.autoconfigure.AutoConfiguration.imports
的新文件。这个新文件最近被引入到了Resilience4J(源代码)中。
用2.0.2
版本覆盖Spring BoM的版本,为我修复了所有弹性依赖关系。我将在几天后检查是否在Spring BoM中更新了新的Resilience4J版本(或者已经引入了Resilience4J - Spring -boot3)。
[编辑]正如其他人注意到的那样,resilience4j-spring-boot3
已经可用了。我将开始使用它。