Автоматическая загрузка SpringBoot работает только со встроенным Tomcat

#spring-boot #nullpointerexception #vaadin #autowired

#весенняя загрузка #исключение nullpointerexception #vaadin #автоматическая загрузка

Вопрос:

У меня есть Spring Boot / Vaadin 14 приложение, которое действительно заставляет меня чесать голову. Я делал это тысячу раз, но, похоже, не могу найти то, чего мне не хватает.

Когда я запускаю приложение со встроенным Tomcat ( spring-boot:run ), все работает. Но когда я запускаю его с помощью внешнего Tomcat 9 (на моем же компьютере), мои автоматически подключаемые зависимости равны нулю.

Мой код:

AppConfig.java

 @SpringBootConfiguration
@ComponentScan("com.example.myapp")
@EnableVaadin
public class AppConfig implements Serializable {
    private static final long serialVersionUID = -2113829779705972298L;
}
  

Просмотр Vaadin ETL:

 @Route(value = "etl", layout = MainView.class)
@PageTitle("ETL")
@RouteAlias(value = "", layout = MainView.class)
public class EtlView extends Div implements Serializable {
    private static final long serialVersionUID = -6417032793665450391L;

    @Autowired
    private AsyncRestClientService service;   // this works with embedded.  NULL with external.
    ...
  

AsyncRestClientService:

 @Service
public class AsyncRestClientService implements Serializable {
    ...
  

MyApplication:

 @SpringBootApplication
public class MyAppApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyAppApplication .class, args);
    }

}
  

Все классы находятся в com.example.myapp пакете, поэтому сканирование компонентов должно выявить это.
Есть идеи, чего мне не хватает?

Кстати, я делаю то же самое с приложением Vaadin 8, и все работает. Даже с моим внешним Tomcat 9.

Спасибо

Редактировать

Обратите внимание, я упаковываю это как WAR в моем pom.xml .

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

1. возможно, вам следует: класс MyAppApplication расширяет SpringBootServletInitializer

2. @9dan это сработало. Но я в тупике, почему? Не могли бы вы сформулировать это как ответ, возможно, с кратким описанием? Я отмечу это как ответ. Спасибо!

3. docs.spring.io/spring-boot/docs/2.3.x/reference/html/…

4. Вы создали приложение в рабочем режиме для развертывания на внешнем Tomcat?

Ответ №1:

Вероятно, вам нужно упаковать приложение как WAR вместо JAR при развертывании приложения Spring Boot на внешнем Tomcat. Проверьте это:https://spring.io/guides/gs/convert-jar-to-war

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

1. На самом деле, я забыл упомянуть об этом. Я упаковываю как войну. Я отредактирую свой вопрос, чтобы отразить это.

2. Вы изменили <packaging> , добавили spring-boot-starter-tomcat и расширили SpringBootServletInitializer ? AFAIK все это требуется для упаковки приложения Spring Boot в качестве WAR.