spring Caused by:java.lang.IllegalStateException:找不到AmbiguityMap,无法Map“appController”bean方法

eoigrqb6  于 2024-01-05  发布在  Spring
关注(0)|答案(9)|浏览(210)

大家早上好,我正在处理一个我无法解码的AmbiguityMap.我正在使用Spring mvc 4.0.6和Hibernate 4.3.6,在tomcat中启动war时出现此错误:

  1. ERROR [localhost-startStop-2]: Context initialization failed
  2. 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
  3. public java.lang.String it.besmart.controller.AppController.newClient(org.springframework.ui.ModelMap)
  4. to {[//new],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'appController' bean method
  5. public java.lang.String it.besmart.controller.AppController.saveClient(it.besmart.models.Client,org.springframework.validation.BindingResult,org.springframework.ui.ModelMap) mapped.
  6. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553)
  7. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
  8. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
  9. at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
  10. at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
  11. at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
  12. at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
  13. at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
  14. at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
  15. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
  16. at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
  17. at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
  18. at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
  19. at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4727)
  20. at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5167)
  21. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
  22. at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
  23. at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
  24. at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
  25. at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:945)
  26. at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1768)
  27. at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
  28. at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  29. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  30. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  31. at java.lang.Thread.run(Thread.java:744)
  32. Caused by: java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'appController' bean method
  33. public java.lang.String it.besmart.controller.AppController.newClient(org.springframework.ui.ModelMap)
  34. to {[//new],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'appController' bean method
  35. public java.lang.String it.besmart.controller.AppController.saveClient(it.besmart.models.Client,org.springframework.validation.BindingResult,org.springframework.ui.ModelMap) mapped.
  36. at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:192)
  37. at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:164)
  38. at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:124)
  39. at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:103)
  40. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:126)
  41. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612)
  42. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
  43. ... 25 more

字符串
我不明白为什么我得到这个错误。AppController是相当直

  1. package it.besmart.controller;
  2. import it.besmart.models.Client;
  3. import it.besmart.service.ClientService;
  4. import java.util.List;
  5. import java.util.Locale;
  6. import javax.validation.Valid;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.context.MessageSource;
  9. import org.springframework.stereotype.Controller;
  10. import org.springframework.ui.ModelMap;
  11. import org.springframework.validation.BindingResult;
  12. import org.springframework.validation.FieldError;
  13. import org.springframework.web.bind.annotation.PathVariable;
  14. import org.springframework.web.bind.annotation.RequestMapping;
  15. import org.springframework.web.bind.annotation.RequestMethod;
  16. @Controller
  17. @RequestMapping("/")
  18. public class AppController {
  19. @Autowired
  20. ClientService clientService;
  21. @Autowired
  22. MessageSource messageSource;
  23. @RequestMapping(value = { "/", "/list" }, method = RequestMethod.GET)
  24. public String listClients(ModelMap model){
  25. List<Client> clients = clientService.findAllClients();
  26. model.addAttribute("clients", clients);
  27. return "allclients";
  28. }
  29. @RequestMapping(value = {"/new"}, method = RequestMethod.POST)
  30. public String newClient(ModelMap model){
  31. Client client = new Client();
  32. model.addAttribute("client", client);
  33. model.addAttribute("edit", false);
  34. return "registration";
  35. }
  36. @RequestMapping(value = {"/new"}, method = RequestMethod.POST)
  37. public String saveClient(@Valid Client client, BindingResult result, ModelMap model){
  38. if(result.hasErrors()){
  39. return "registration";
  40. }
  41. clientService.saveClient(client);
  42. model.addAttribute("success", "Client" + client.getNomeClient() + "registrato correttamente");
  43. return "success";
  44. }
  45. @RequestMapping(value = { "/edit-{name}-client"}, method = RequestMethod.POST)
  46. public String updateClient(@Valid Client client, BindingResult result, ModelMap model, @PathVariable String name ){
  47. if(result.hasErrors()){
  48. return "registration";
  49. }
  50. if(!clientService.isClientNameUnique(client.getIdClient(), client.getNomeClient())){
  51. FieldError idErr = new FieldError("client", "name", messageSource.getMessage("non.unique.nome_client", new String[]{client.getNomeClient()}, Locale.getDefault()));
  52. result.addError(idErr);
  53. return "registration";
  54. }
  55. clientService.saveClient(client);
  56. model.addAttribute("success", "Client" + client.getNomeClient() + "aggiornato correttamente");
  57. return "success";
  58. }
  59. @RequestMapping(value = { "/delete-{id}-client" }, method = RequestMethod.GET)
  60. public String deleteClient(@PathVariable int id){
  61. clientService.deleteClientById(id);
  62. return "redirect:/list";
  63. }
  64. }


ClientService.java

  1. package it.besmart.service;
  2. import it.besmart.models.Client;
  3. import java.util.List;
  4. public interface ClientService {
  5. Client findById(int id);
  6. void saveClient(Client client);
  7. void updateClient(Client client);
  8. void deleteClientById(int id);
  9. List <Client> findAllClients();
  10. Client findClientByName(String name);
  11. boolean isClientNameUnique(Integer id, String name);
  12. }


它看起来对我来说就像它是相当直的一切...我是相当新的这种应用程序..谢谢

mdfafbf1

mdfafbf11#

这是您收到的错误消息:
找到了AmbiguityMap。无法Map“appController”bean方法public java.lang.String it.besmart.controller.AppController.newClient(org.springframework.ui.ModelMap)到{[//new],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}:已经存在“appController”bean方法public java.lang.String it.besmart.controller.AppController.saveClient(it.besmart.models.Client,org.springframework.validation.BindingResult,org.springframework.ui.ModelMap)Map。
它告诉你你Map了多个方法来处理POST到URL /new。如果Web浏览器向URL /new发出POST请求,你的哪个方法应该处理它?
以下是两种令人反感的方法:

  1. @RequestMapping(value = {"/new"}, method = RequestMethod.POST)
  2. public String newClient(ModelMap model){
  3. Client client = new Client();
  4. model.addAttribute("client", client);
  5. model.addAttribute("edit", false);
  6. return "registration";
  7. }
  8. @RequestMapping(value = {"/new"}, method = RequestMethod.POST)
  9. public String saveClient(@Valid Client client, BindingResult result, ModelMap model){
  10. if(result.hasErrors()){
  11. return "registration";
  12. }
  13. clientService.saveClient(client);
  14. model.addAttribute("success", "Client" + client.getNomeClient() + "registrato correttamente");
  15. return "success";
  16. }

字符串
我怀疑第一个是不正确的;您可能希望使用RequestMethod.GET而不是RequestMethod.POST

展开查看全部
qcbq4gxm

qcbq4gxm2#

我遇到了这个问题,并通过在PostMapping中将name替换为value来解决它。

  1. @PostMapping(name = "/greetings/sayHi")
  2. public Object sayHi() {
  3. return "Hello";
  4. }

字符串
更换钥匙name

  1. @PostMapping(value = "/greetings/sayHi")
  2. public Object sayHi() {
  3. return "Hello";
  4. }

展开查看全部
efzxgjgh

efzxgjgh3#

在我的例子中,我找不到错误中的一个方法。服务器没有被更新。尝试清理并重建。如果使用intellij,请删除[project dir]/target文件夹。

l5tcr1uw

l5tcr1uw4#

当Tomcat的Tomcat 8.0\work\Catalina\localhost\没有被正确清除时也有同样的错误。不得不手动删除,重新启动Tomcat,然后应用程序运行没有错误。

6ojccjat

6ojccjat5#

在我的例子中,一个上层类已经定义了Map请求。这就是为什么它给我错误。

wa7juj8i

wa7juj8i6#

将params添加到下面的代码中,就可以开始了。

  1. @RequestMapping(value = {"/new"}, method = RequestMethod.POST, params = "filter")
  2. public String saveClient(@PathVariable("filter") final String filter,@Valid Client client, BindingResult result, ModelMap model){
  3. if(result.hasErrors()){
  4. return "registration";
  5. }
  6. clientService.saveClient(client);
  7. model.addAttribute("success", "Client" + client.getNomeClient() + "registrato correttamente");
  8. return "success";
  9. }

字符串

展开查看全部
pes8fvy9

pes8fvy97#

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

  1. @RequestMapping(value="/products", method=RequestMethod.POST)
  2. private List<Product> getProducts() {
  3. return productService.getProducts();
  4. }

字符串
将其公开应该可以解决这个问题。

3mpgtkmj

3mpgtkmj8#

  1. @RequestMapping(value = {"/new"}, method = RequestMethod.POST)
  2. public String newClient(ModelMap model)
  3. @RequestMapping(value = {"/new"}, method = RequestMethod.POST)
  4. public String saveClient(@Valid Client client, BindingResult result, ModelMap)

字符串
尝试概括这部分。可能值相同会导致请求Map的歧义。

hk8txs48

hk8txs489#

  • 备注:此解决方案适用于错误信息,但不适用于问题本身。*

在我的例子中,bean定义缺少id,这会导致重复的示例化:

  1. <bean class="it.besmart.controller.AppController"/>

字符串
我的解决方案是添加ID:

  1. <bean id="appController" class="it.besmart.controller.AppController"/>

相关问题