Java UnsatifiedPendencyException:请求的bean当前正在创建无法解析的循环引用
我有一个源类,它显然破坏了集成测试。代码如下所示Java UnsatifiedPendencyException:请求的bean当前正在创建无法解析的循环引用,java,spring,junit,mockito,wiremock,Java,Spring,Junit,Mockito,Wiremock,我有一个源类,它显然破坏了集成测试。代码如下所示 @Configuration @Import( EmailageConfiguration.class ) public class EmailageServiceConfiguration { private static final String EMAILAGE_ACCOUNT_ID_CONFIG_KEY = "emailage.key"; private static final String EMAILAGE_API_
@Configuration
@Import( EmailageConfiguration.class )
public class EmailageServiceConfiguration {
private static final String EMAILAGE_ACCOUNT_ID_CONFIG_KEY = "emailage.key";
private static final String EMAILAGE_API_KEY_CONFIG_KEY = "emailage.secret";
private final EmailageConfigHolder holder;
public EmailageServiceConfiguration( final EmailageConfigHolder holder ) {
this.holder = holder;
}
@Bean
public EmailageConfigHolder emailageConfigHolder( Environment env ) {
// final EmailageConfigHolder holder = new EmailageConfigHolder();
holder.setApiKey( env.getRequiredProperty( EMAILAGE_API_KEY_CONFIG_KEY ) );
holder.setAccountId( env.getRequiredProperty( EMAILAGE_ACCOUNT_ID_CONFIG_KEY ) );
return holder;
}
}
提供了IT测试
public class EmailageServiceIT {
private static final String EMAILAGE_RESPONSE_FILE = "emailage-response.json";
private final static String EMAILAGE_ENDPOINT = "/emailage";
private EmailageService service;
@Rule
public WireMockRule wireMockRule = new WireMockRule( wireMockConfig().dynamicPort() );
@Before
@SuppressWarnings( "resource" )
public void setup() {
int port = wireMockRule.port();
System.setProperty( "emailage.uri", "http://localhost:" + port + EMAILAGE_ENDPOINT );
System.setProperty( "emailage.key", "123" );
System.setProperty( "emailage.secret", "123" );
System.setProperty( "emailage.connection_timeout", "10000" );
System.setProperty( "emailage.read_timeout", "10000" );
System.setProperty( "kafka.bootstrap_servers", "localhost" );
System.setProperty( "kafka.topic", "ella-test-topic" );
ApplicationContext context = new AnnotationConfigApplicationContext( EmailageServiceConfiguration.class );
service = context.getBean( EmailageService.class );
}
// .........................
}
当我运行maven命令时,我得到了错误堆栈
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'emailageServiceConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'emailageServiceConfiguration': Requested bean is currently in creation: Is there an unresolvable circular reference?
at com.ratepay.ella.service.EmailageServiceIT.setup(EmailageServiceIT.java:64)
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'emailageServiceConfiguration': Requested bean is currently in creation: Is there an unresolvable circular reference?
at com.ratepay.ella.service.EmailageServiceIT.setup(EmailageServiceIT.java:64)
因此,IT测试基本上在LOC中中断
ApplicationContext context = new AnnotationConfigApplicationContext( EmailageServiceConfiguration.class );
我还为这个问题添加了EmailageConfigHolder
类
@Getter
@Setter
public class EmailageConfigHolder {
private String apiKey;
private String accountId;
}
我该怎么纠正呢?也许我错了,但是
EmailageServiceConfiguration
负责创建BeanEmailageConfigHolder
(这不是@Bean注释所表达的吗)
那么spring应该如何将它传递给应该创建它的对象的构造函数呢?这就是你的循环依赖性最可能的来源
若要修复此问题,请为EmailageServiceConfiguration创建一个独立的生产者。是否可以根据此问题添加示例代码段?我尝试了几个选项,但迄今为止都没有成功。我对spring不是很熟悉,但您是否可以提供有关EmailageConfigHolder的更多信息(以及生成它所需的内容/例如从何处获取环境?)我可以在正确的方向指出你。我在BuffDeCI中添加了<代码> EMAGAGECOMPLAND 这是一个后续问题,因为在发布这个问题后,代码发生了变化:我会考虑调用构造函数<代码>最终eMaGeAcGeFraveWordHealth=新eMaGeEngRealOfDeloDe();code>在你的工厂方法中(毕竟,这是一种工厂方法),并重新考虑单元测试/断言(如接受答案的第二段所述)。我同意@sfiss。如果您只是更改了代码以便可以模拟它,我的建议是将其还原为以前的代码,并验证生成的holder对象是否包含正确的值。