2012-01-18 18 views
15

Sto giocando con Spring MVC 3.1 e testando diverse funzionalità. Ho voluto verificare il seguente dichiarazione tratta da @RequestMapping#value docSpring MVC 3: trovata mappatura ambigua

If you have a single default method (without explicit path mapping), then all requests without a more specific mapped method found will be dispatched to it. If you have multiple such default methods, then the method name will be taken into account for choosing between them 

Così ho creato a seguito di controllo con diversi metodi di gestore predefinito.

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

    @RequestMapping 
    public @ResponseBody String greet() { 
     return "Hi Book!"; 
    } 

    @RequestMapping 
    public @ResponseBody String meet() { 
     return "Nice to meet you Book!"; 
    } 
} 

Ecco configurazione del contesto applicazione web

<beans ....> 
<!-- Use @Component annotations for bean definitions --> 
    <context:component-scan base-package="com.botreeconsulting.lms.web"/> 

    <!-- Use @Controller annotations for MVC controller definitions --> 
    <mvc:annotation-driven /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 

     <property name="prefix"> 
      <value>/WEB-INF/views/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
    </bean> 

</beans> 

ma sembra Ho sbagliato qualcosa come mi sta dando seguente errore al momento della distribuzione:

java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'bookController' bean method 
public java.lang.String com.botreeconsulting.lms.web.BookController.meet() 
to {[/book],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'bookController' bean method 
public java.lang.String com.botreeconsulting.lms.web.BookController.greet() mapped. 

Ora la domanda è questo controller modella ciò che è scritto nel documento? Sento che non l'ho capito bene. Per favore guidami a modellare il controller in modo che corrisponda alla dichiarazione su più gestori predefiniti.

Grazie, Amit

risposta

26

Se si dispone di un controller come indicato di seguito, tutte le richieste di diversi /book/edit sarà diretto a mydefault() mentre /book/edit verrà inviato a meet().

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

    @RequestMapping 
    public @ResponseBody String mydefault() { 
     return "Hi Book!"; 
    } 

    @RequestMapping("/edit") 
    public @ResponseBody String meet() { 
     return "Nice to meet you Book!"; 
    } 
} 

Nell'esempio si dispone di due metodi senza mappatura del percorso esplicita.

+0

'mydefault()' gestirà/prenota solo non/book/abc. –

+0

Arun, 'Se si dispone di più di questi metodi predefiniti ...'. È possibile configurare più metodi predefiniti? –

+0

Cosa intendi per più valori predefiniti? In ogni progetto ci sarà solo un default –

5

Arun, la risposta è corretta con l'avvertenza che in Spring 3.1 dipende da quale coppia di HandlerMapping-HandlerAdapter è configurata.

Il problema descritto è supportata con il DefaultAnnotationHandlerMapping & AnnotationMethodHandlerAdapter che sono stati in uso dal Spring 2.5 e sono ancora abilitati per impostazione predefinita quando nessun altro fagioli HandlerMapping e HandlerAdapter sono definiti.

Il RequestMappingHandlerMapping e RequestMappingHandlerAdapter aggiunti nella primavera 3.1 (vedere i documenti di riferimento di Spring 3.1) in sostituzione del primo non supportano lo stesso comportamento, ovvero il ripristino del nome del metodo in caso di mapping ambigui e il possesso di un metodo predefinito (quando non sono definiti mapping espliciti). La nuova coppia HandlerMapping-HandlerAdapter è abilitata per impostazione predefinita dallo spazio dei nomi MVC e dalla configurazione Java MVC ed è consigliata per l'utilizzo futuro.

Il documento Java a cui fa riferimento Arun ha bisogno di un aggiornamento. Ho creato un ticket per quello SPR-9042.

+0

Ciao, Rossen. Puoi chiarire un po 'l'istruzione 'abilitata di default dallo spazio dei nomi MVC? - intendi il tag' ', oppure il tag registra solo un'altra coppia di HandlerMapping/HandlerAdapter? –

+0

Inoltre, puoi guardare http://stackoverflow.com/questions/13671776/spring-mvc-why-this-hello-world-run-well-without-annotation-driven-tag-unlike-a - in questo domanda il controllore è annotato solo con '@Controller' mentre il suo singolo metodo è annotato '@RequestMapping ("/ hello")' sto comprendendo correttamente che questa configurazione funzionerà solo nelle versioni pre 3.1 (senza ' 'tag) a causa dei cambiamenti nella primavera 3.1? –

Problemi correlati