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

无Spring Boot的Spring配置:/main/hello端点404问题排查

非Spring Boot环境下Spring MVC配置404问题排查

问题描述

尝试在不使用Spring Boot的情况下配置Spring,已添加Tomcat依赖、创建MainController类并配置Dispatcher Servlet,但访问端点http://localhost:8080/main/hello时出现404错误,怀疑问题出在ServletDispatcherConfig中。

相关代码

ServletDispatcherConfig类

@Component
public class ServletDispatcherConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {SpringConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }
}

SpringConfig类

@Configuration
@ComponentScan("example.test")
@EnableWebMvc
public class SpringConfig {


    private final ApplicationContext applicationContext;

    @Autowired
    public SpringConfig(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }


    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        var resolver = new SpringResourceTemplateResolver();
        resolver.setCacheable(true);
        resolver.setPrefix("/WEB-INF/templates/");
        resolver.setSuffix(".html");
        resolver.setApplicationContext(applicationContext);
        resolver.setTemplateMode(TemplateMode.HTML);
        return resolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        var engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        engine.setEnableSpringELCompiler(true); // delete if any bugs will be
        return engine;
    }

    @Bean
    public ThymeleafViewResolver viewResolver() {
        var templateResolver = new ThymeleafViewResolver();
        templateResolver.setTemplateEngine(templateEngine());
        return templateResolver;
    }
}

MainController类

@Controller
@RequestMapping("/main")
public class MainController {

    @GetMapping("/first")
    public String main() {
        return "/main";
    }


    @GetMapping("/hello")
    public String hello() {
        return "/main";
    }
}

问题排查及解决建议

  • 移除ServletDispatcherConfig上的@Component注解:AbstractAnnotationConfigDispatcherServletInitializer是Servlet容器用来初始化Spring MVC的入口类,不需要被Spring组件扫描,加@Component会导致不必要的加载冲突,直接删除该注解即可。
  • 检查视图文件路径:Controller返回的"/main"会被Thymeleaf解析为/WEB-INF/templates/main.html,请确认该文件存在且路径正确。如果视图文件在/WEB-INF/templates/main/main.html,则返回值应改为"main/main"(去掉开头的斜杠,避免路径重复)。
  • 验证组件扫描范围:确认MainController所在的包是否包含在example.test下,@ComponentScan需要覆盖到Controller所在包,否则Spring无法识别并加载该Controller。
  • 检查Tomcat部署上下文:确认项目部署到Tomcat后的上下文路径是否为根路径。如果上下文路径不是根,访问地址需要加上项目名,例如http://localhost:8080/your-project-name/main/hello。

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:01:30