В моем приложении 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 Autowiring на Java 8 Optional, и это не работает.
Я смог работать без каких-либо исключений с очень похожей конфигурацией. Возникает ли исключение сразу во время/после запуска теста или это происходит при попытке доступа к BImpl.restTemplate
? Если вы не трогаете необязательный bean-компонент, то в моем локальном нет проблем.
Не знаю почему, но это на самом деле вызывает у меня много проблем. Тем не менее, я работал над этим, используя ObjectProvider
Spring. Оставь это здесь для других, если кто-нибудь наткнется
Не уверен, что это точное решение этой проблемы, но при попытке с необязательным типом Java 8 это не сработало. Однако, когда я переключился на Spring ObjectProvider
, он работает нормально. В идеале это всего лишь обходной путь, а не основная причина этой проблемы.
Как именно вы создаете боб
RestTemplate
?