Spring+Hibernate角色认证授权时DispatcherServlet URI映射缺失问题
解决Spring DispatcherServlet找不到请求URI映射的问题
你遇到的No mapping found for HTTP request with URI [/Shoping/home]错误,核心是Spring MVC的配置出现了冲突或遗漏,导致控制器映射没有被正确注册。结合你的代码,我整理了几个关键修复点:
1. 合并WebMvc配置类,消除配置冲突
你现在有两个继承WebMvcConfigurerAdapter的配置类,还同时扫描同一个包,这种情况很容易导致配置混乱:
ShoppingServletConfig没加@EnableWebMvc,里面的视图解析器配置根本不会生效;WebConfigStatic加了@EnableWebMvc但没包含视图解析器,两个类的配置无法协同工作。
修复方案:把两个配置类的逻辑合并成一个,统一管理WebMvc相关配置:
@Configuration @EnableWebMvc @EnableTransactionManagement @ComponentScan(basePackages = "com.project.shopping") public class ShoppingWebConfig extends WebMvcConfigurerAdapter { // 视图解析器配置 @Bean public ViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setViewClass(JstlView.class); viewResolver.setPrefix("/WEB-INF/ui/view/"); viewResolver.setSuffix(".jsp"); return viewResolver; } // 静态资源处理器配置 @Override public void addResourceHandlers(final ResourceHandlerRegistry registry) { registry.addResourceHandler("/js/**").addResourceLocations("/ui/js/"); registry.addResourceHandler("/css/**").addResourceLocations("/ui/css/"); registry.addResourceHandler("/*.html").addResourceLocations("/ui/view/"); // 原配置里的"/*.html/**"路径写法不合理,改成"/*.html"更符合静态资源匹配逻辑 } }
然后修改ShoppingInitializerWeb,注册合并后的配置类,同时调整DispatcherServlet的映射规则:
public class ShoppingInitializerWeb implements WebApplicationInitializer { public void onStartup(ServletContext container) throws ServletException { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(ShoppingWebConfig.class); ctx.setServletContext(container); ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx)); servlet.setLoadOnStartup(1); servlet.addMapping("/"); // 把原来的"/*"改成"/",避免拦截容器对JSP的直接处理请求,这是Spring MVC推荐的映射方式 } }
2. 确认控制器被正确扫描
检查你的UserController是否在com.project.shopping包(或其子包)下,确保@ComponentScan能扫描到它。另外确认控制器注解没有写错:
@Controller @RequestMapping("/") public class UserController { @RequestMapping(value = { "/", "/home" }, method = RequestMethod.GET) public String homePage(ModelMap model) { model.addAttribute("user", getPrincipal()); return "welcome"; } // 要确保getPrincipal()方法存在且没有编译/运行错误 }
这个配置本身是正确的,会映射/Shoping/和/Shoping/home两个请求。
3. 验证配置生效情况
启动服务器后,查看控制台日志:
- 找有没有类似
Mapped "{[/ || /home],methods=[GET]}" onto public java.lang.String com.project.shopping.controller.UserController.homePage(org.springframework.ui.ModelMap)的日志,出现这条就说明控制器映射已经注册成功; - 确认没有配置加载相关的报错信息。
如果还是有问题,可以开启Spring MVC的DEBUG日志,查看请求处理的详细流程,进一步定位问题。
内容的提问来源于stack exchange,提问作者Bishwa Karki
相关产品推荐
相关产品推荐

