Spring 4.3.0.RELEASE中@RestController返回404问题求助
我来帮你排查这个@RestController返回404的问题,咱们一步步来分析:
1. 先检查请求路径的匹配问题
你的不工作场景中,控制器的映射是@RequestMapping(value = "/aa/", method = RequestMethod.GET)(末尾带斜杠),但你请求的地址是http://localhost:8080/srik/aa(不带斜杠)。虽然Spring MVC默认允许斜杠匹配,但不同版本可能有细微差异,你可以先尝试请求带斜杠的地址:http://localhost:8080/srik/aa/,看看是否能正常返回。
如果带斜杠能正常工作,而你想支持两种路径(带/不带斜杠),可以直接把映射改成"/aa"(去掉末尾斜杠),或者在<mvc:annotation-driven />里配置斜杠匹配规则。
2. 排查Jersey与Spring MVC的冲突
我注意到你的pom.xml里引入了Jersey(jersey-spring和jersey-server)依赖,Jersey是JAX-RS的实现框架,而Spring MVC是独立的MVC解决方案,两者在处理请求时可能会产生冲突。
@RestController是Spring MVC特有的注解(相当于@Controller + @ResponseBody),如果Jersey的类干扰了Spring MVC的注解扫描或请求处理逻辑,就可能导致@RestController的接口无法被正确识别。
你可以尝试暂时移除Jersey相关的依赖,然后重启项目,看看@RestController的接口是否能正常工作。如果恢复正常,就说明是Jersey的冲突问题,你可以选择:
- 移除Jersey,完全使用Spring MVC来实现RESTful API
- 配置Jersey的Servlet只处理特定前缀的请求(比如
/api/*),避免和Spring MVC的DispatcherServlet争抢所有请求
3. 确认组件扫描是否覆盖到@RestController类
检查你的JSONController(使用@RestController的那个)是否在org.ateam.common包下?你的Spring配置里<context:component-scan base-package="org.ateam.common" />只会扫描这个包及其子包下的组件,如果类不在这个范围内,Spring就无法检测到它。
4. 修正pom.xml中的拼写错误
我看到pom里有个拼写错误:<maven-war-pugin>2.4</maven-war-pugin>,应该是<maven-war-plugin>2.4</maven-war-plugin>。虽然这个可能不是导致404的直接原因,但可能会影响项目打包和部署,建议修正。
5. 检查Spring配置文件的xsd版本
你的spring-servlet.xml里使用的是Spring 3.1的xsd,但项目用的是Spring 4.3.0版本,虽然向下兼容,但最好把xsd版本改成对应4.3的,避免潜在的配置问题:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
额外测试:简化@RestController的返回值
你可以暂时把不工作的控制器方法简化,直接返回字符串,看看是否能正常响应:
@RestController public class JSONController { @RequestMapping(value = "/aa", method = RequestMethod.GET) public String orderBooking() { return "srik"; } }
这样可以排除ResponseEntity的使用是否有问题。
按照上面的步骤逐一排查,应该能找到问题所在。
内容的提问来源于stack exchange,提问作者srikanth r

