SpringBoot Autowired仅适用于嵌入式Tomcat

问题描述

我有一个Spring Boot / Vaadin 14应用程序,确实使我抓狂。我已经做了1000次,但似乎找不到我想要的东西。

当我使用嵌入式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 {
    ...

我的应用程序:

@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中。

解决方法

在将Spring Boot应用程序部署到外部Tomcat时,您可能需要将该应用程序打包为WAR而不是JAR。检查一下:https://spring.io/guides/gs/convert-jar-to-war