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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:17:38