Spring Boot在运行测试时不允许Optional Bean懒加载

3
在我的Spring Boot 2.1应用程序中,我有一个服务类,大概长这个样子:
@Service
public class AImpl implements A {
    @Autowired
    B bservice;
}

然后自动装配的服务B看起来像这样:

@Service
public class BImpl implements B {
    @Autowired(required = false)
    @Lazy
    org.springframework.web.client.RestOperations restTemplate;
}

在我的测试类中:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {...})
@DataJpaTest
@EnableJpaRepositories("com.xxx")
@EntityScan("com.xxx")
public class CImplTest {
    @Autowired
    B bservice;
    @Autowired
    A aservice;
}

当我运行测试时,出现以下错误信息:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.web.client.RestOperations' available: Optional dependency not present for lazy injection point

然而在运行应用程序时,我并没有遇到这个问题,它能够正常运行。

注意:我已经尝试将rstTemplate自动装配替换为Java 8 Optional,但效果不佳。


你如何准确地创建RestTemplate bean? - g00glen00b
我能够使用非常相似的配置运行而没有任何异常。异常是在测试启动期间/之后立即抛出,还是当您尝试访问BImpl.restTemplate时发生?如果您不触摸可选bean,则在我的本地没有问题。 - buræquete
不知道为什么,但这实际上给我带来了很多问题。然而,我使用Spring提供的“ObjectProvider”解决了这个问题。如果其他人遇到同样的问题,我在这里留下了解决方法。 - Killer Beast
1个回答

0

不确定这是否是解决此问题的确切方法,但在尝试使用Java 8可选类型时,这并没有奏效。然而,当我切换到Spring的ObjectProvider时,它可以正常工作。理想情况下,这只是一个解决方法,而不是此问题的根本原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接