Spring Boot не позволяет опциональному компоненту быть ленивым при выполнении тестов

В моем приложении 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, и это не работает.

Как именно вы создаете боб RestTemplate?

g00glen00b 20.06.2019 13:52

Я смог работать без каких-либо исключений с очень похожей конфигурацией. Возникает ли исключение сразу во время/после запуска теста или это происходит при попытке доступа к BImpl.restTemplate ? Если вы не трогаете необязательный bean-компонент, то в моем локальном нет проблем.

buræquete 21.06.2019 05:24

Не знаю почему, но это на самом деле вызывает у меня много проблем. Тем не менее, я работал над этим, используя ObjectProvider Spring. Оставь это здесь для других, если кто-нибудь наткнется

Killer Beast 09.07.2019 13:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
704
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не уверен, что это точное решение этой проблемы, но при попытке с необязательным типом Java 8 это не сработало. Однако, когда я переключился на Spring ObjectProvider, он работает нормально. В идеале это всего лишь обходной путь, а не основная причина этой проблемы.

Другие вопросы по теме