报错原因:
springboot启动类启动时,会默认扫描启动类所在的目录,在启动类上添加ComponentScan去指定扫描位置,从而可以扫多个包,尤其是第三方中的jar/maven依赖中的组件
解决方法:
使用@ComponentScan注解,将需要扫描的包包含进去
或者将controller放在与springboot配制类同级的位置
因为我的项目是maven构建的cloud多模块,controller控制器所在模块和启动类所在不是同一个
所以还需要先在主启动类的服务的pom中引入扫不到的控制器所在微服务的依赖,然后再用@ComponentScan
示例:
package com.test.app;
@SpringBootApplication
@ComponentScan(basePackages = {"com.test.creator", "com.test.app"})
public class LicenseApp extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(LicenseApp.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(LicenseApp.class);
}
}
但是,当指定扫描包"com.test.creator"后,原来的包默认扫描器会随之失效,如果不注意,会导致项目的组件没办法使用;还需要在启动类上,添加当前项目的包位置"com.test.app"
或者还有一种可能
spring boot load-on-startup默认值是-1,项目启动时,默认不会初始化DispatcherServlet,也就是不会调用Servlet接口的init()方法。
需要在配置文件中引入配置:
spring.mvc.servlet.load-on-startup=1
或者
spring:
mvc:
servlet:
load-on-startup: 1
spring的基础还需要巩固下
参考:
https://blog.csdn.net/qq_53679247/article/details/127958228
https://blog.csdn.net/qq_42006801/article/details/125279281