2015-04-29 20 views
15

Ich versuche eine App zu erstellen, die einige Werte aus der Datenbank auflisten und modifizieren, hinzufügen, löschen kann, falls nötig mit Spring 4, und ich erhalte den folgenden Fehler (nur wenn die "@Controller" -Anmerkung vorhanden ist in beiden meiner Controller-Dateien, wenn ich die Anmerkung von einer der Dateien zu löschen, es funktioniert, aber ich eine Nachricht in der Konsole erhalten „keine Zuordnung gefunden ... in DispatcherServlet mit dem Namen ...):Spring mvc Mehrdeutige Zuordnung gefunden. Controller-Bean-Methode kann nicht zugeordnet werden

INFO : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/edit/{id}],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.bookReview.app.BookController.editBook(int,org.springframework.ui.Model) 
WARN : org.springframework.web.context.support.XmlWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'reviewController' bean method 
public java.lang.String com.bookReview.app.ReviewController.editReview(int,org.springframework.ui.Model) 
to {[/edit/{id}],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'bookController' bean method 
public java.lang.String com.bookReview.app.BookController.editBook(int,org.springframework.ui.Model) mapped. 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    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:4728) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5166) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399) 
    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:745) 
Caused by: java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'reviewController' bean method 
public java.lang.String com.bookReview.app.ReviewController.editReview(int,org.springframework.ui.Model) 
to {[/edit/{id}],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'bookController' bean method 
public java.lang.String com.bookReview.app.BookController.editBook(int,org.springframework.ui.Model) mapped. 
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:212) 
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:184) 
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:144) 
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:123) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:126) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570) 
    ... 21 more 

diese Datei ist mein pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.bookReview.app</groupId> 
    <artifactId>BookReviewApp</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 
    <name>BookReviewApp</name> 
    <description>review app</description> 

    <!-- <properties> 

     Generic properties 
     <java.version>1.8</java.version> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 

     Spring 
     <spring-framework.version>4.0.3.RELEASE</spring-framework.version> 

     Hibernate/JPA 
     <hibernate.version>4.3.5.Final</hibernate.version> 
     <hibernate.version>3.6.9.Final</hibernate.version> 

     Logging 
     <logback.version>1.0.13</logback.version> 
     <slf4j.version>1.7.5</slf4j.version> 

    </properties> --> 

    <dependencies> 
    <!-- Spring --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.1.6.RELEASE</version> 
     <!-- Exclude Commons Logging in favor of SLF4j --> 
      <exclusions> 
       <exclusion> 
        <groupId>commons-logging</groupId> 
        <artifactId>commons-logging</artifactId> 
       </exclusion> 
      </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>4.1.6.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>4.1.6.RELEASE</version> 
    </dependency> 
    <!-- Hibernate --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.3.9.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>4.3.9.Final</version> 
    </dependency> 
    <!-- Apache Commons DBCP --> 
    <dependency> 
     <groupId>commons-dbcp</groupId> 
     <artifactId>commons-dbcp</artifactId> 
     <version>1.4</version> 
    </dependency> 
    <!-- Spring ORM --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>4.1.6.RELEASE</version> 
    </dependency> 
    <!-- AspectJ --> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     <version>1.8.5</version> 
    </dependency> 
    <!-- Logging --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.12</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jcl-over-slf4j</artifactId> 
     <version>1.7.12</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>1.7.12</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>1.2.15</version> 
      <exclusions> 
       <exclusion> 
        <groupId>javax.mail</groupId> 
        <artifactId>mail</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>javax.jms</groupId> 
        <artifactId>jms</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>com.sun.jdmk</groupId> 
        <artifactId>jmxtools</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>com.sun.jmx</groupId> 
        <artifactId>jmxri</artifactId> 
       </exclusion> 
      </exclusions> 
      <scope>runtime</scope> 
     </dependency> 
     <!-- @Inject --> 
     <dependency> 
      <groupId>javax.inject</groupId> 
      <artifactId>javax.inject</artifactId> 
      <version>1</version> 
     </dependency> 
     <!-- Servlet --> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
      <version>2.5</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet.jsp</groupId> 
      <artifactId>jsp-api</artifactId> 
      <version>2.2.1-b03</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.7</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 
     <!-- Test --> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.35</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aop</artifactId> 
      <version>4.1.6.RELEASE</version> 
     </dependency> 
    </dependencies> 
</project> 

Dies ist meine Datei web.xml

<?xml version="1.0" encoding="UTF-8"?> 

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <!-- The definition of the Root Spring Container shared by all Servlets and Filters --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/app/root-context.xml</param-value> 
    </context-param> 

    <!-- Creates the Spring Container shared by all Servlets and Filters --> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <!-- Processes application requests --> 
    <servlet> 
     <servlet-name>servlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/app/servlet/sevlet-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>servlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

</web-app> 

Das ist mein sevlet-context.xml Datei

<?xml version="1.0" encoding="UTF-8"?> 

<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> 

    <!-- DispatcherServlet Context: defines this servlet's request-processing 
     infrastructure --> 

    <!-- Enables the Spring MVC @Controller programming model --> 
    <annotation-driven /> 

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving 
     up static resources in the ${webappRoot}/resources directory --> 
    <resources mapping="/resources/**" location="/resources/" /> 

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources 
     in the /WEB-INF/views directory --> 
    <beans:bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <beans:property name="prefix" value="/WEB-INF/views/" /> 
     <beans:property name="suffix" value=".jsp" /> 
    </beans:bean> 

    <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
     <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <beans:property name="url" 
      value="jdbc:mysql://localhost:3306/test" /> 
     <beans:property name="username" value="serban" /> 
     <beans:property name="password" value="serban" /> 
    </beans:bean> 

    <!-- Hibernate 4 SessionFactory Bean definition --> 
    <beans:bean id="hibernate4AnnotatedSessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <beans:property name="dataSource" ref="dataSource" /> 
     <beans:property name="annotatedClasses"> 
      <beans:list> 
       <beans:value>com.bookReview.app.model.book</beans:value> 
       <beans:value>com.bookReview.app.model.review</beans:value> 
      </beans:list> 
     </beans:property> 
     <beans:property name="hibernateProperties"> 
      <beans:props> 
       <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect 
       </beans:prop> 
       <beans:prop key="hibernate.show_sql">true</beans:prop> 
      </beans:props> 
     </beans:property> 
    </beans:bean> 

    <beans:bean id="bookDAO" class="com.bookReview.app.dao.bookDAOImpl"> 
     <beans:property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" /> 
    </beans:bean> 
    <beans:bean id="bookService" class="com.bookReview.app.service.BookServiceImpl"> 
     <beans:property name="bookDAO" ref="bookDAO"></beans:property> 
    </beans:bean> 

    <beans:bean id="reviewDAO" class="com.bookReview.app.dao.reviewDAOImpl"> 
     <beans:property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" /> 
    </beans:bean> 
    <beans:bean id="reviewService" class="com.bookReview.app.service.ReviewServiceImpl"> 
     <beans:property name="reviewDAO" ref="reviewDAO"></beans:property> 
    </beans:bean> 

    <!-- <default-servlet-handler/> --> 

    <context:component-scan base-package="com.bookReview.app" /> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

     <beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <beans:property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" /> 
    </beans:bean> 

    </beans:beans> 

Diese Datei mein BookController.java ist

package com.bookReview.app; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

import com.bookReview.app.model.book; 
import com.bookReview.app.service.BookService; 


@Controller 
public class BookController { 

    private BookService bookService; 

    @Autowired(required=true) 
    @Qualifier(value="bookService") 
    public void setBookService(BookService bs){ 
     this.bookService = bs; 
    } 

    @RequestMapping(value = "/books", method = RequestMethod.GET) 
    public String listBooks(Model model) { 
     model.addAttribute("book", new book()); 
     model.addAttribute("listBooks", this.bookService.listBooks()); 
     return "book"; 
    } 

    //For add and update book both 
     @RequestMapping(value= "/book/add", method = RequestMethod.POST) 
     public String addBook(@ModelAttribute("book") book b){ 

      if(b.getBookid() == 0){ 
       //new book, add it 
       this.bookService.addBook(b); 
      }else{ 
       //existing book, call update 
       this.bookService.updateBook(b); 
      } 

      return "redirect:/books"; 

     } 

     @RequestMapping("/remove/{id}") 
     public String removeBook(@PathVariable("id") int id){ 

      this.bookService.removeBook(id); 
      return "redirect:/books"; 
     } 

     @RequestMapping("/edit/{id}") 
      public String editBook(@PathVariable("id") int id, Model model){ 
       model.addAttribute("book", this.bookService.getBookById(id)); 
       model.addAttribute("listBooks", this.bookService.listBooks()); 
       return "book"; 
      } 


} 

Und das ist meine ReviewController.java Datei

package com.bookReview.app; 


import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

import com.bookReview.app.model.review; 
import com.bookReview.app.service.ReviewService; 


@Controller 
public class ReviewController { 

    private ReviewService reviewService; 

    @Autowired(required=true) 
    @Qualifier(value="reviewService") 
    public void setReviewService(ReviewService rs){ 
     this.reviewService = rs; 
    } 

    @RequestMapping(value = "/reviews", method = RequestMethod.GET) 
    public String listReviews(Model model) { 
     model.addAttribute("book", new review()); 
     model.addAttribute("listReviews", this.reviewService.listReviews()); 
     return "review"; 
    } 

    //For add and update review both 
    @RequestMapping(value= "/review/add", method = RequestMethod.POST) 
    public String addReview(@ModelAttribute("review") review r){ 

     if(r.getId() == 0){ 
      //new review, add it 
      this.reviewService.addReview(r); 
     }else{ 
      //existing review, call update 
      this.reviewService.updateReview(r); 
     } 

     return "redirect:/reviews"; 

    } 

    @RequestMapping("/remove/{id}") 
    public String removeReview(@PathVariable("id") int id){ 

     this.reviewService.removeReview(id); 
     return "redirect:/reviews"; 
    } 

    @RequestMapping("/edit/{id}") 
     public String editReview(@PathVariable("id") int id, Model model){ 
      model.addAttribute("review", this.reviewService.getReviewById(id)); 
      model.addAttribute("listReviews", this.reviewService.listReviews()); 
      return "review"; 
     } 


} 

Vielen Dank

+1

Wow. Das ist viel Code. Sind Sie sicher, dass dies ein [minimales vollständiges überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) ist, Betonung auf dem Minimum? Wenn Sie ein minimales Beispiel erstellen, können andere Ihren Fehler schneller identifizieren und können Ihnen auch helfen, das Problem selbst zu finden. – Cecilia

+1

Sorry, ich habe versucht, so viele Informationen wie möglich zu geben, damit das Problem leichter rückverfolgt werden kann. Wenn Sie darauf achten, die Pom, Web und Servlet Kontext XML-Dateien sind notwendig, weil es den Fehler gibt, außer dass Sie das Fehlerprotokoll finden können, die auch wichtig ist und zwei Klassen-Dateien, die es in Ordnung war, legte ich sie in vollem Format weil Das Problem lag am Ende dieser beiden Dateien. danke trotzdem –

Antwort

26

Sie sollten

@Controller("/review") 
public class ReviewController { 

und

@Controller("/book") 
public class BookController { 

weil in Ihrem Code Sie haben die beiden Methoden ohne expliziten/eindeutigen Pfad für die Zuordnung (zB schreiben. wenn wir einen Anruf/edit/1 haben, ist dies unmöglich, eindeutig ein Controller-Methode von Ihrem editBook BookController oder ReviewController editReview)

+0

Vielen Dank das war das Problem, in erster Linie änderte ich den Namen der "Bearbeiten" und "Entfernen" von ReviewController in "Review bearbeiten" und "Review entfernen" und ich konnte @Controller nicht ändern @Controller (/ book) also habe ich @Controller (value = "book") benutzt, ich hoffe es stimmt. Vielleicht ist es eine andere Frühlingsversion. Jetzt habe ich nur die Console-Nachricht: Keine Zuordnung gefunden für HTTP-Anfrage mit URI [/ BookReviewApp /] in DispatcherServlet mit dem Namen 'Servlet' Ich weiß nicht, ob es zu diesem Problem verwandt ist oder nicht –

15

Wenn das Problem über mehrdeutige Methode zu bestimmen, ist, wahrscheinlich die @RequestMapping soll die Frage sein. Wechsel von @RequestMapping (Name = ...) zu @RequestMapping (Wert = ...)

@RequestMapping(name = "xxx.htm", method = RequestMethod.GET) 

zu

@RequestMapping(value = "xxx.htm", method = RequestMethod.GET) 
+0

danke! Du sparst meinen Tag! –

+0

Diese Antwort war meine Lösung für das oben beschriebene Problem bei der Verwendung des Spring-Boot-Frameworks. Vielen Dank! – Fratt

+0

Danke! rettete meinen Tag! – NeoP5