如何用SimpleUrlHandlerMapping为同一Controller映射多URL并解决冲突
解决SimpleUrlHandlerMapping模糊映射问题
错误原因分析
你创建了两个MainController实例Bean,同时Controller类/方法本身带有@RequestMapping注解,这导致同一个请求映射被重复注册:一方面是Controller自带的注解映射,另一方面是SimpleUrlHandlerMapping的配置映射,Spring无法确定应该使用哪个处理器,因此抛出Ambiguous mapping错误。
正确配置方案
方案1:直接用@RequestMapping注解实现多URL映射(推荐)
去掉SimpleUrlHandlerMapping的配置,直接在Controller的方法上通过@RequestMapping指定对应URL,这是Spring MVC最常用的方式。
示例Controller代码:
@Controller public class MainController { // 映射/home到该方法,返回home.jsp @RequestMapping("/home") public String home() { return "home"; } // 映射/adminhome到该方法,返回adminhome.jsp @RequestMapping("/adminhome") public String adminHome() { return "adminhome"; } }
同时确保视图解析器配置正确,能定位到/WEB-INF/pages/下的jsp文件:
@Configuration @EnableWebMvc @ComponentScan(basePackages = "com.yourpackage") public class WebConfig implements WebMvcConfigurer { @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/pages/"); resolver.setSuffix(".jsp"); return resolver; } }
方案2:使用SimpleUrlHandlerMapping(无注解映射)
如果坚持要用SimpleUrlHandlerMapping,需要移除Controller类/方法上的所有@RequestMapping注解,并且只创建一个MainController实例,通过映射配置将不同URL指向该实例的不同方法。
修改后的Controller:
// 去掉@Controller注解,或保留但移除所有@RequestMapping public class MainController { public String home() { return "home"; } public String adminHome() { return "adminhome"; } }
配置类代码:
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { // 创建唯一的MainController实例 @Bean public MainController mainController() { return new MainController(); } @Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping(); Properties urlProperties = new Properties(); // 配置URL到Controller实例的映射 urlProperties.put("/home", "mainController"); urlProperties.put("/adminhome", "mainController"); mapping.setMappings(urlProperties); // 设置优先级,确保该映射优先于其他默认映射 mapping.setOrder(0); return mapping; } // 视图解析器配置同上 @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/pages/"); resolver.setSuffix(".jsp"); return resolver; } // 配置HandlerAdapter,让Spring能正确调用Controller方法 @Bean public SimpleControllerHandlerAdapter simpleControllerHandlerAdapter() { return new SimpleControllerHandlerAdapter(); } }
关键注意点
- 禁止同时混用
@RequestMapping注解和SimpleUrlHandlerMapping对同一个Controller进行映射,这是触发模糊错误的核心原因。 - 使用注解方式时,确保每个请求URL仅对应一个Controller方法,避免重复映射。
- 视图解析器的前缀和后缀必须准确,否则无法找到对应的jsp文件。
内容的提问来源于stack exchange,提问作者charles didonato
相关产品推荐
相关产品推荐

