Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Caused by: java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'appController' bean method

Tags:

Good morning all, i'm dealing with an Ambiguous mapping i cannot decode... I'm using Spring mvc 4.0.6 and hibernate 4.3.6 I'm getting this error while launching the war in 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 

I can't understand why i'm getting this error. AppController is quite straight

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<Client> 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 <Client> findAllClients();      Client findClientByName(String name);      boolean isClientNameUnique(Integer id, String name);  } 

It looks to me like it's quite straight everything... I'm quite new to this kind of application.. Thanks

like image 780
MarioC Avatar asked Nov 22 '15 11:11

MarioC


2 Answers

This is the error message you are getting:

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.

It's telling you you're mapping more than one method to handle a POST to the URL /new. If the web browser makes a POST request to the URL /new, which of your methods should handle it?

Here are the two offending methods:

    @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";      } 

I suspect that the first of these is incorrect; you probably want to use RequestMethod.GET instead of RequestMethod.POST for that.

like image 167
Luke Woodward Avatar answered Sep 21 '22 02:09

Luke Woodward


In my case I couldn't find one of the methods in the error. The server wasn't being updated. Try clean and rebuild. If using intellij delete the [project dir]/target folder.

like image 44
Philip Rego Avatar answered Sep 19 '22 02:09

Philip Rego