引起:java.lang.IllegalStateException:找到不明确的映射。 无法映射’appController’bean方法

大家早上好,我正在处理一个不能解码的模糊映射…我正在使用Spring mvc 4.0.6和hibernate 4.3.6我在tomcat中启动战争时遇到此错误:

ERROR [localhost-startStop-2]: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'appController' bean method public java.lang.String it.besmart.controller.AppController.newClient(org.springframework.ui.ModelMap) to {[//new],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'appController' bean method public java.lang.String it.besmart.controller.AppController.saveClient(it.besmart.models.Client,org.springframework.validation.BindingResult,org.springframework.ui.ModelMap) mapped. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4727) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5167) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:945) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1768) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:744) Caused by: java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'appController' bean method public java.lang.String it.besmart.controller.AppController.newClient(org.springframework.ui.ModelMap) to {[//new],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'appController' bean method public java.lang.String it.besmart.controller.AppController.saveClient(it.besmart.models.Client,org.springframework.validation.BindingResult,org.springframework.ui.ModelMap) mapped. at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:192) at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:164) at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:124) at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:103) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:126) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549) ... 25 more 

我无法理解为什么我会收到这个错误。 AppController很直接

 package it.besmart.controller; import it.besmart.models.Client; import it.besmart.service.ClientService; import java.util.List; import java.util.Locale; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("/") public class AppController { @Autowired ClientService clientService; @Autowired MessageSource messageSource; @RequestMapping(value = { "/", "/list" }, method = RequestMethod.GET) public String listClients(ModelMap model){ List clients = clientService.findAllClients(); model.addAttribute("clients", clients); return "allclients"; } @RequestMapping(value = {"/new"}, method = RequestMethod.POST) public String newClient(ModelMap model){ Client client = new Client(); model.addAttribute("client", client); model.addAttribute("edit", false); return "registration"; } @RequestMapping(value = {"/new"}, method = RequestMethod.POST) public String saveClient(@Valid Client client, BindingResult result, ModelMap model){ if(result.hasErrors()){ return "registration"; } clientService.saveClient(client); model.addAttribute("success", "Client" + client.getNomeClient() + "registrato correttamente"); return "success"; } @RequestMapping(value = { "/edit-{name}-client"}, method = RequestMethod.POST) public String updateClient(@Valid Client client, BindingResult result, ModelMap model, @PathVariable String name ){ if(result.hasErrors()){ return "registration"; } if(!clientService.isClientNameUnique(client.getIdClient(), client.getNomeClient())){ FieldError idErr = new FieldError("client", "name", messageSource.getMessage("non.unique.nome_client", new String[]{client.getNomeClient()}, Locale.getDefault())); result.addError(idErr); return "registration"; } clientService.saveClient(client); model.addAttribute("success", "Client" + client.getNomeClient() + "aggiornato correttamente"); return "success"; } @RequestMapping(value = { "/delete-{id}-client" }, method = RequestMethod.GET) public String deleteClient(@PathVariable int id){ clientService.deleteClientById(id); return "redirect:/list"; } } 

ClientService.java

 package it.besmart.service; import it.besmart.models.Client; import java.util.List; public interface ClientService { Client findById(int id); void saveClient(Client client); void updateClient(Client client); void deleteClientById(int id); List  findAllClients(); Client findClientByName(String name); boolean isClientNameUnique(Integer id, String name); } 

它看起来像是非常直接的一切…我对这种应用很新…谢谢

这是您收到的错误消息:

发现了模糊的映射。 无法将’appController’bean方法public java.lang.String it.besmart.controller.AppController.newClient(org.springframework.ui.ModelMap)映射到{[// new],methods = [POST],params = [], headers = [],consume = [],produce = [],custom = []}:已经有’appController’bean方法

它告诉你,你正在映射多个方法来处理一个POST到URL /new 。 如果Web浏览器向URL /new发出POST请求,您的哪个方法应该处理它?

以下是两种违规方法:

  @RequestMapping(value = {"/new"}, method = RequestMethod.POST) public String newClient(ModelMap model){ Client client = new Client(); model.addAttribute("client", client); model.addAttribute("edit", false); return "registration"; } @RequestMapping(value = {"/new"}, method = RequestMethod.POST) public String saveClient(@Valid Client client, BindingResult result, ModelMap model){ if(result.hasErrors()){ return "registration"; } clientService.saveClient(client); model.addAttribute("success", "Client" + client.getNomeClient() + "registrato correttamente"); return "success"; } 

我怀疑其中第一个是不正确的; 你可能想要使用RequestMethod.GET而不是RequestMethod.POST

当Tomcat的Tomcat 8.0\work\Catalina\localhost\未正确清除时也会出现相同的错误。 不得不手动删除,重新启动Tomcat,然后app运行没有错误。

这与此处报道的问题无关,但由于这是谷歌在此问题上的最大搜索。 我还想提一下这个问题出现的另一个原因是当你将控制器方法标记为私有时(它发生在我身上,因为我使用IDE自动完成方法)。

 @RequestMapping(value="/products", method=RequestMethod.POST) private List getProducts() { return productService.getProducts(); } 

公开应该解决这个问题。