Spring MVC REST Controller调用失败,访问/api/customer返回404求助
从你的描述和提供的代码来看,我梳理了几个最可能导致/customer-crm/api/customer返回404的原因,按优先级逐一排查:
1. 应用上下文路径不匹配
你的pom.xml中明确配置了finalName和warName为SpringHibernateExample:
<warName>SpringHibernateExample</warName> ... <finalName>SpringHibernateExample</finalName>
这意味着war包部署到Tomcat后,应用的上下文路径是/SpringHibernateExample,而非你当前访问的/customer-crm。
解决方法:
尝试访问正确的路径:http://localhost:8080/SpringHibernateExample/api/customer
如果希望上下文路径为customer-crm,直接修改pom.xml中的finalName和warName为customer-crm即可。
2. 缺少Spring MVC的DispatcherServlet初始化配置
你提供了Spring MVC配置类AppConfiguration和持久化配置类HibernateConfiguration,但没有Web应用初始化类(即AbstractAnnotationConfigDispatcherServletInitializer的实现)。这个类是Spring MVC的入口,负责注册DispatcherServlet并将请求路由到Spring容器,没有它的话,你的REST Controller根本不会被Spring识别和处理。
解决方法:
在com.customer.crm.configuration包下创建WebAppInitializer类:
package com.customer.crm.configuration; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { // 加载根容器配置(如Hibernate等非Web相关逻辑) @Override protected Class<?>[] getRootConfigClasses() { return new Class[] { HibernateConfiguration.class }; } // 加载Servlet容器配置(Spring MVC相关逻辑) @Override protected Class<?>[] getServletConfigClasses() { return new Class[] { AppConfiguration.class }; } // 指定DispatcherServlet处理所有请求 @Override protected String[] getServletMappings() { return new String[] { "/" }; } }
这个类会替代传统的web.xml,自动完成DispatcherServlet的注册和配置加载,Spring才能扫描到你的Index控制器并处理/api/customer请求。
3. 额外检查点
如果上面两个问题解决后仍出现404,可以补充检查:
- 确认
AppConfiguration的@ComponentScan(basePackages = "com.customer.crm")覆盖了Index控制器所在的com.customer.crm.rest包(这里是没问题的,父包扫描会包含所有子包)。 - 查看Tomcat启动日志,是否存在类似
Mapped "{[/api/customer],methods=[GET]}" onto public com.customer.crm.entity.Customer com.customer.crm.rest.Index.getIndex()的日志,如果没有,说明控制器未被注册,回到配置类检查。 - 注意Spring 4.0.6与Jackson 2.9.6的兼容性:Spring 4.0.x官方推荐Jackson版本为2.3.x,高版本可能引发序列化问题,但这只会影响返回结果格式,不会导致404,后续若返回JSON异常可考虑降低Jackson版本到2.3.3。
内容的提问来源于stack exchange,提问作者m.y.m

