Spring MVC项目Bean未创建,访问接口出现404问题求助
排查Spring MVC接口404+Controller未初始化的实用步骤
遇到这种部署后接口404、Controller Bean还没初始化的问题,我帮你梳理几个关键排查方向,一步步来定位:
1. 先盯紧AppInitializer的配置
Spring MVC的Initializer是整个应用的启动入口,配置错了直接导致所有Bean都加载不起来:
- 检查
getRootConfigClasses()和getServletConfigClasses()是否正确返回了你的AppConfig类,别漏写或者写错类名 - 重点看
getServletMappings()的路径配置——你的接口是/magicart-service/product,这里必须映射到能覆盖这个前缀的路径,比如"/magicart-service/*",不然DispatcherServlet根本接收不到请求 - 给你个正确的Initializer参考写法:
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[]{AppConfig.class}; } @Override protected Class<?>[] getServletConfigClasses() { return null; // 若你的MVC配置和根配置放一起,这里也可以返回AppConfig } @Override protected String[] getServletMappings() { return new String[]{"/magicart-service/*"}; // 必须匹配接口的前缀 } }
2. 检查AppConfig的组件扫描和MVC启用
AppConfig是Spring的核心配置类,没配置对的话Spring找不到你的Controller、Service:
- 必须加
@EnableWebMvc注解,这是开启Spring MVC核心功能的开关,漏了的话MVC相关的注解全失效 - 确认
@ComponentScan指定了正确的包路径,比如你的所有类都在com.magicart下,就得写@ComponentScan(basePackages = "com.magicart"),别只扫了Service或者DAO的包,把Controller漏了 - 参考配置:
@Configuration @EnableWebMvc @ComponentScan(basePackages = "com.magicart") // 替换成你的实际根包名 public class AppConfig { // 其他Bean配置(比如视图解析器、数据源等)... }
3. 验证ProductController的注解是否到位
Controller类得被Spring识别才能初始化:
- 类上必须加
@Controller或者@RestController(如果是返回JSON的接口,@RestController更省心,不用每个方法加@ResponseBody) - 检查
@RequestMapping的路径是否匹配:比如你访问的是/magicart-service/product,如果DispatcherServlet映射了/magicart-service/*,那Controller里的路径应该是@GetMapping("/product")(类上可以不加前缀,或者加@RequestMapping("/")) - 关于你加的静态代码块没输出:别只用IDE控制台看,去Tomcat的
logs/catalina.out文件里找找,有时候IDE的控制台会过滤部分输出;另外确保静态代码块是写在Controller类里的,比如:
@RestController public class ProductController { static { System.out.println("ProductController 初始化了!"); // 去catalina.out里搜这句 } @Autowired private ProductService productService; @GetMapping("/product") public List<Product> getProducts() { return productService.getProducts(); } }
4. 确认Tomcat的上下文路径是否匹配
你访问路径里的/magicart-service是项目的上下文路径吗?
- 如果是war包部署,war包名字是
magicart-service.war的话,上下文路径默认就是/magicart-service,没问题;如果war包名字不对,得把访问路径的前缀改成实际的上下文路径 - 要是在IDE里部署,可以直接在部署配置里把上下文路径设为
/magicart-service,避免自动生成的随机路径
5. 排查Service和DAO的注解是否正确
虽然现在是Controller没初始化,但如果Service或DAO的Bean创建失败,会导致整个Spring上下文加载失败:
ProductServiceImpl必须加@Service注解,ProductDAOImpl必须加@Repository注解,Spring才能扫描到这些Bean- 检查注入是否正确:Controller里注入
ProductService要用@Autowired或者@Resource,别漏加注解导致依赖注入失败
6. 查看Tomcat启动日志找异常
去Tomcat的catalina.out或者IDE的启动日志里搜关键词,比如ERROR、Exception:
- 如果Spring上下文初始化失败,日志里会明确告诉你哪里错了——比如包扫描路径不存在、某个Bean的依赖找不到、数据源配置错误等等,这些都会导致Controller根本没机会初始化
按照上面的步骤从前往后排查,90%的问题都出在Initializer和AppConfig的配置上,先把这两个核心配置搞定,再去查其他细节。
内容的提问来源于stack exchange,提问作者Uttiya Ghosh
相关产品推荐
相关产品推荐

