Я пытаюсь использовать Spring MVC для создания веб-приложения. В этом приложении (которое является проектом в IntelliJ) у меня есть @Controller
с тремя @Service
с, которые должны быть @Autowired
. Я также использую Spring DevTools для ускорения разработки, но это также источник этой проблемы.
Я не буду включать свой фактический код здесь (так как он будет слишком длинным), но ниже пара фиктивных @Service
с, которые по структуре похожи на мои @Service
классы.
Service1. java
// package & imports
public interface Service1 {
void foo();
// lots of other methods
}
Service1Impl. java
// package & imports
@Slf4j
@Service
public class Service1Impl implements Service1 {
@Override
public void foo() {
log.info("Foo!");
}
// lots of other code
}
Service2. java
// package & imports
public interface Service2 {
void bar();
// lots of other methods
}
Service2Impl. java
// package & imports
@Slf4j
@Service
public class Service2Impl implements Service2 {
@Override
public void bar() {
log.info("bar!");
}
// lots of other code
}
И так далее. Мой класс @Controller
имеет зависимости обоих этих @Service
s, которые вводятся через @Autowired.
SiteController. java
// package & imports
@Slf4j // not used but is there in my code
@Controller
public class SiteController {
private final Service1 service1;
private final Service2 service2;
@Autowired
public SiteController(Service1 one, Service2 two) {
service1 = one;
service2 = two;
}
@ResponseBody // just for simplicity's sake
@GetMapping("/")
public String index() {
service1.foo();
service2.bar();
return "<!DOCTYPE html><html><head><meta charset=\"UTF-8\" /></head><body>Hello, there!</body></html>";
}
}
Запуск приложения работает нормально , Однако, когда я перестраиваю проект в IntelliJ, Spring DevTools иногда выдает мне ошибку в консоли, аналогичную приведенной ниже, после попытки перезапустить приложение:
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 1 of constructor in (@Controller classpath) required a bean of type '(@Service classpath)' that could not be found.
Action:
Consider defining a bean of type '(@Service classpath)' in your configuration.
Однако код контроллера должен быть функциональным. Если я изменю конструктор на это,
public SiteController(@Autowired Service1 one, @Autowired Service2 two) {
service1 = one;
service2 = two;
}
Я не смогу повторить ошибку. Однако две разные версии конструктора должны быть эквивалентны. Ошибка произошла и с этой версией.
Что здесь происходит, и это ошибка? Я абсолютно в замешательстве, так как мой код работает правильно в первый раз, но после перезапуска Spring DevTools он иногда падает.