You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC Java配置控制器未触发,访问首页报404问题求助

Spring MVC 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/目录下,与视图解析器配置的前缀路径一致。

验证步骤

  1. 修正上述配置后,重启Tomcat服务器。
  2. 访问http://localhost:14639/project/,观察控制台是否输出i am working..。
  3. 若控制台输出正常,页面应显示<h1>Hello world..</h1>,表示问题已解决。

内容的提问来源于stack exchange,提问作者Nishan Kumar Shrestha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:07:03