Как я могу заставить мое приложение Spring Boot распознать эту службу?

#java #spring #spring-boot

#java #spring #spring-boot

Вопрос:

Я работаю над приложением на основе Spring Boot 2.3. У меня есть контроллер, который в настоящее время имеет одну автоматическую зависимость:

 public class ValidationController {

    private ValidationService validationService;

    @Autowired
    public ValidationController(ValidationService validationService) {
        this.validationService = validationService;
    }
}
  

У меня есть тесты, которые выполняются в этой службе и проходят. Я пытаюсь добавить вторую службу к этому контроллеру:

 public class ValidationController {

    private ValidationService validationService;
    private TokenService tokenService;

    @Autowired
    public ValidationController(ValidationService validationService, TokenService tokenService) {
        this.validationService = validationService;
        this.tokenService = tokenService;
    }
}
  

Когда я делаю это, все мои ValidationControllerTest обращения начинают завершаться неудачей. Я нашел это сообщение в трассировке стека:

Вызвано: org.springframework.beans.factory.Исключение NoSuchBeanDefinitionException: отсутствует соответствующий компонент типа ‘com.example.auth.service.service.Доступен токенсервис: ожидается, что по крайней мере 1 компонент, который квалифицируется как кандидат на автоматическое подключение. Аннотации зависимостей: {}

Мой TokenService интерфейс выглядит следующим образом:

 public interface TokenService {
    JsonWebToken getToken(User user, Account account);
}
  

Реализация снабжена аннотацией @Service :

 @Service
public class TokenServiceImpl implements TokenService {
    private final String url;
    private final String username;
    private final String password;

    public TokenServiceImpl(
            @Value("${service.url}") String url,
            @Value("${service.username}") String username,
            @Value("${service.password}") String password
    ) {
        this.url = url;
        this.username = username;
        this.password = password;
    }

    @Override
    public JsonWebToken getToken(User user, Account account) {
        ...

        return jsonWebToken;
    }
}
  

My ValidationService выглядит очень похоже на my TokenService в том, что касается аннотаций, но по какой-то причине Spring Boot может найти my ValidationService просто отлично, но my TokenService , который находится в том же месте, нигде не найден.

Как мне убедиться, что Spring Boot может найти мой TokenService ?


Большое спасибо за комментарии!

Можете ли вы дважды проверить, что вы вызываете контекст приложения Spring в своих тестах?

Насколько я понимаю, @WebMvcTest аннотация загрузит контекст моего приложения, это точно? У меня есть следующие аннотации к моему ValidationControllerTest классу:

 @ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = ValidationController.class)
  

Достаточно ли этого для загрузки контекста приложения в моих тестах?

Можете ли вы дважды проверить, что этот контекст выполняет сканирование компонента в пакет, в котором TokenServiceImpl он находится?

Я новичок в Spring Boot и все еще пытаюсь выполнить сканирование компонентов grok. У меня есть @SpringBootApplication аннотация к моему основному AuthServiceApplication классу, который находится в com.example.auth.service пакете. Я прочитал о сканировании компонентов здесь:

Если другие ваши иерархии пакетов находятся ниже вашего основного приложения с @SpringBootApplication аннотацией, вы охвачены неявным сканированием компонентов.

Мой TokenServiceImpl класс находится по адресу com.example.auth.service.service.impl , что, я думаю, означает, что он находится в иерархии основного приложения, поэтому он должен быть охвачен неявным сканированием компонентов. Это точно?

Можете ли вы дважды проверить, что ValidationService это не издевается (с помощью аннотации @Mock или чего-то еще) где-нибудь в вашем наборе тестов?

У меня есть следующее в моем ValidationServiceImplTest :

 @MockBean
private TokenService tokenService;
  

Похоже, я не использую его в данный момент. Я удалю это @MockBean и посмотрю, поможет ли это.

Комментарии:

1. Можете ли вы дважды проверить, что 1- вы вызываете контекст приложения spring в своих тестах 2 — этот контекст выполняет сканирование компонента в пакет, в котором TokenServiceImpl он находится 3 — ValidationService не издевается (через @Mock аннотацию или что-то еще) где -нибудь в вашем наборе тестов. Дополнительно: получаете ли вы дополнительные ошибки после этой трассировки стека, которая говорит о том, что что-то TokenServiceImpl не может быть создано (возможно, из-за отсутствия введенных @Value файлов или чего-то еще).

2. Можете ли вы опубликовать свой тестовый класс?

3. Есть ли у вас какой-либо класс @Configuration в вашем проекте. Возможно, вам нужно изменить область сканирования компонентов. Возможно, пакет Service TokenServiceImpl не сканируется