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

Spring Boot创建'requestMappingHandlerMapping' Bean报错:请求映射歧义

解决Spring Boot中Ambiguous mapping请求映射冲突问题

你碰到的这个Ambiguous mapping错误其实很好解决,核心问题出在你对@RequestMapping注解的使用上——你错误地用了name属性来指定请求URL路径,但name属性的作用只是给这个映射起一个描述性的名称,根本不是用来定义路径的!

当你没有给@RequestMapping指定value或者path属性时,Spring会默认把请求路径设为空字符串。这就导致你控制器里的newServer、getServer等多个GET方法,全都映射到了同一个空路径上,自然就触发了映射冲突的错误。

修改后的正确代码

只需要把每个@RequestMapping里的name替换成value(或者path,两者功能完全一致)就行:

@Controller
public class CSPServerController {
    @Autowired
    ServerService serverService;
    @Autowired
    AuditLogService auditLogService;

    @RequestMapping(value = "/servers", method = RequestMethod.GET)
    @PreAuthorize("hasRole(T(com.nathanenglish.serverlldmanagementtool.config.GlobalConfig).RoleReadOnly)")
    public String loadServers(Model model){
        model.addAttribute("servers",serverService.getAll());
        return "servers";
    }

    @RequestMapping(value = "/servers/new", method = RequestMethod.GET)
    @PreAuthorize("hasRole(T(com.nathanenglish.serverlldmanagementtool.config.GlobalConfig).RoleEdit)")
    public String newServer(Model model){
        model.addAttribute("server", new Server());
        model.addAttribute("auditLog", new AuditLog());
        return "server";
    }

    @RequestMapping(value = "/servers/{id}", method = RequestMethod.GET)
    @PreAuthorize("hasRole(T(com.nathanenglish.serverlldmanagementtool.config.GlobalConfig).RoleEdit)")
    public String getServer(@PathVariable Long id, Model model){
        model.addAttribute("server", serverService.getById(id));
        model.addAttribute("auditLog", new AuditLog());
        return "server";
    }

    @RequestMapping(value = "/servers/save", method = RequestMethod.POST)
    @PreAuthorize("hasRole(T(com.nathanenglish.serverlldmanagementtool.config.GlobalConfig).RoleEdit)")
    public String saveServer(Model model, @Valid Server server, @Valid AuditLog auditLog, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            return "server";
        }
        serverService.save(server);
        auditLogService.save(auditLog);
        return "redirect:/servers";
    }

    @RequestMapping(value = "/servers/delete/{id}", method = RequestMethod.GET)
    @PreAuthorize("hasRole(T(com.nathanenglish.serverlldmanagementtool.config.GlobalConfig).RoleEdit)")
    public String deleteServer(@PathVariable Long id, Model model){
        serverService.deleteByID(id);
        return "redirect:/servers";
    }
}

额外优化建议

Spring 4.3及以上版本推荐使用更简洁的HTTP方法专用注解,比如@GetMapping、@PostMapping,这样可以省略method属性,让代码更清爽:

// 替代@RequestMapping(value = "/servers", method = RequestMethod.GET)
@GetMapping("/servers")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:45:54