Tomcat运行后无法识别非Spring Boot的Spring RESTful服务
问题:Spring REST服务无法触发Controller请求(非Spring Boot)
我正在尝试构建一个不使用Spring Boot的简单Spring RESTful服务,已经编写了配置类,但测试Controller时请求无法触发该Controller。使用Java Servlet时一切正常,推测问题可能出在配置或依赖中,目前无法自行解决,项目基于IntelliJ构建。
配置类
DispatcherServlet初始化类
public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[0]; } @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringConfig.class}; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } }
Spring配置类
@Configuration @EnableWebMvc @ComponentScan(basePackages ="ru.spring.testRest") public class SpringConfig { }
控制器
@RestController @RequestMapping("/rest") public class TestRest { @GetMapping("/here") public String test(){ System.out.println("TRIGGERED"); return "test"; } }
依赖(截图内容)
- Spring Web MVC 5.3.24
- Spring Context 5.3.24
- Servlet API 4.0.1
- JSTL 1.2
Tomcat配置(截图内容)
使用本地Tomcat 9.0.65作为应用服务器
排查建议
- 包扫描范围验证
确认ru.spring.testRest包层级完全包含TestRest控制器,检查包名拼写(大小写、层级)是否完全匹配,避免因路径错误导致Controller未被扫描到。 - DispatcherServlet初始化检查
- 在
DispatcherServletInitializer的方法中添加打印语句或断点,验证Tomcat启动时是否执行了初始化逻辑,确认Spring配置类被正确加载。 - 检查
getServletMappings()设置为"/"是否与其他自定义Servlet冲突,确保DispatcherServlet能接管所有请求。
- 在
- 依赖Scope调整
将Servlet API依赖的scope设置为provided,避免和Tomcat自带的Servlet API版本冲突,配置示例:<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> - 请求路径正确性
确认请求URL为http://localhost:[Tomcat端口]/[项目上下文路径]/rest/here,检查IntelliJ中Tomcat配置的Application Context是否正确(默认可能为空或为项目名)。 - 日志追踪
添加SLF4J和Logback依赖,开启Spring MVC的DEBUG级别日志,查看请求处理流程:- 确认DispatcherServlet是否接收到请求
- 检查是否成功匹配到
TestRest的/rest/here映射
- Spring MVC注解驱动验证
虽然@EnableWebMvc已经默认配置了注解驱动,但可以手动实现WebMvcConfigurer接口到SpringConfig中,确保注解能被正常解析:@Configuration @EnableWebMvc @ComponentScan(basePackages ="ru.spring.testRest") public class SpringConfig implements WebMvcConfigurer { // 若需要自定义配置可在此添加,默认@EnableWebMvc已覆盖基础配置 }
内容的提问来源于stack exchange,提问作者buchs
相关产品推荐
相关产品推荐

