Spring MVC Java配置控制器未触发,访问首页报404问题求助
问题描述
使用Spring MVC、JSP及Java配置开发Web应用,首页index.jsp存放于WEB-INF/jsp/目录下。配置了带@GetMapping("/")注解的viewsController返回字符串"index",由InternalResourceViewResolver(前缀/WEB-INF/jsp/,后缀.jsp)解析。启动应用后访问http://localhost:14639/project/出现404错误,提示"请求的资源[/project/]不可用",控制器中的System.out语句未执行,控制台仅输出Tomcat启动日志,应用上下文路径为"project"。
相关配置代码
DispatcherServlet配置
package Configurations; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; @Configuration @ComponentScan(basePackages="controller") public class MainConfig extends AbstractAnnotationConfigDispatcherServletInitializer{ @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[] {javaBasedConfig.class}; } @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] {WebConfig.class}; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } }
Web配置
package Configurations; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration @EnableWebMvc @ComponentScan(basePackages = "controller.viewsController") public class WebConfig implements WebMvcConfigurer { @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/jsp/"); resolver.setSuffix(".jsp"); return resolver; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("/static/"); } }
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>Hello world..</h1> </body> </html>
viewsController
package controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class viewsController { @GetMapping("/") public String home() { System.out.println("i am working.."); return "index"; // 映射到/WEB-INF/jsp/index.jsp } }
问题原因与解决方案
1. 组件扫描范围错误
WebConfig中@ComponentScan指定的包路径是controller.viewsController,但实际控制器类viewsController位于controller根包下,导致Spring无法扫描到该控制器,请求无法被处理。
修正方法:
将WebConfig中的@ComponentScan修改为扫描controller包:
@ComponentScan(basePackages = "controller")
或者直接删除WebConfig中的@ComponentScan,因为MainConfig已经配置了@ComponentScan(basePackages="controller"),避免重复扫描。
2. DispatcherServlet初始化器冗余注解
MainConfig继承自AbstractAnnotationConfigDispatcherServletInitializer,该类的职责是配置DispatcherServlet,本身不需要添加@Configuration和@ComponentScan注解,这些注解应该放在根配置和Servlet配置类中。
修正方法:
移除MainConfig上的@Configuration和@ComponentScan注解:
package Configurations; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class MainConfig extends AbstractAnnotationConfigDispatcherServletInitializer{ @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[] {javaBasedConfig.class}; } @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] {WebConfig.class}; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } }
3. 验证根配置类有效性
确保javaBasedConfig.class是一个有效的Spring配置类(添加@Configuration注解),如果不需要根配置,可以返回null:
@Override protected Class<?>[] getRootConfigClasses() { return null; }
4. 确认文件路径正确性
检查index.jsp是否确实存放在WEB-INF/jsp/目录下,与视图解析器配置的前缀路径一致。
验证步骤
- 修正上述配置后,重启Tomcat服务器。
- 访问
http://localhost:14639/project/,观察控制台是否输出i am working..。 - 若控制台输出正常,页面应显示
<h1>Hello world..</h1>,表示问题已解决。
内容的提问来源于stack exchange,提问作者Nishan Kumar Shrestha

