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
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With