2012-01-18 16 views
15

Estoy jugando con Spring MVC 3.1 y probando diferentes funciones. Quería verificar siguiente declaración tomada de @RequestMapping#value docSpring MVC 3: asignación ambigua hallada

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 

Así que creé siguiente controlador con múltiples métodos de controlador por defecto.

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

Aquí es la aplicación web de configuración contexto

<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> 

pero parece que metí la pata algo, ya que me está dando siguiente error en el momento de la implementación:

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. 

Ahora la pregunta ¿este controlador modela lo que está escrito en el documento? Siento que no lo entendí correctamente. Por favor, guíame para modelar el controlador para que coincida con la declaración sobre múltiples controladores predeterminados.

Gracias, Amit

Respuesta

26

Si tiene un controlador como se indica a continuación, todas las solicitudes que no sean /book/edit será dirigido a mydefault() mientras /book/edit serán enviados 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!"; 
    } 
} 

En su muestra tiene dos métodos sin asignación de ruta explícita.

+0

'mydefault()' manejará/libro solo no/libro/abc. –

+0

Arun, 'Si tiene varios de estos métodos predeterminados ...'. ¿Es posible configurar múltiples métodos predeterminados? –

+0

¿Qué quiere decir con múltiples valores predeterminados? En cualquier diseño solo habrá un predeterminado –

5

Arun, su respuesta es correcta con la advertencia de que en Spring 3.1 depende de qué par de HandlerMapping-HandlerAdapter esté configurado.

El comportamiento descrito es compatible con DefaultAnnotationHandlerMapping & AnnotationMethodHandlerAdapter que se han utilizado desde Spring 2.5 y todavía están habilitados de forma predeterminada cuando no se definen otros beans HandlerMapping y HandlerAdapter.

El RequestMappingHandlerMapping y RequestMappingHandlerAdapter añaden en la primavera de 3,1 (ver Spring docs 3.1 de referencia) como un reemplazo para la antigua no son compatibles con el mismo comportamiento - es decir, volver a caer en el nombre del método en el caso de asignaciones ambiguas, así como tener una método predeterminado (cuando no se definen mapeos explícitos). El nuevo par HandlerMapping-HandlerAdapter se habilita de forma predeterminada desde el espacio de nombres MVC y desde la configuración MVC Java y se recomienda su uso en el futuro.

El documento de Java al que hace referencia Arun necesita una actualización. Creé un boleto para ese SPR-9042.

+0

Hola, Rossen. ¿Puedes aclarar un poco la declaración 'habilitada por defecto del espacio de nombres MVC' - ¿te refieres a la etiqueta' ', o la etiqueta registra solo otro par de HandlerMapping/HandlerAdapter? –

+0

Además, ¿puedes mirar http://stackoverflow.com/questions/13671776/spring-mvc-why-this-hello-world-run-well-without-annotation-driven-tag-unlike-a - en este pregunta si el controlador está anotado solo con '@Controller' mientras su único método está anotado '@RequestMapping ("/ hello")' entiendo correctamente que esta configuración solo funcionará en las versiones anteriores a la 3.1 (sin ' 'tag) debido a los cambios en Spring 3.1? –

Cuestiones relacionadas