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
相关产品推荐
相关产品推荐

