2012-01-18 1 views
15

Я играю с весной MVC 3.1 и тестирую различные функции. Я хотел проверить следующее заявление, взятое из @RequestMapping#value docSpring MVC 3: Неоднозначное картирование найдено

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 

Так что я создал следующий контроллер с несколькими методами обработчика по умолчанию.

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

Вот конфигурация контекста веб-приложения

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

Но, кажется, я испортил что-то, как он дает мне следующее сообщение об ошибке во время развертывания:

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. 

Теперь вопрос является ли этот контроллер моделирует то, что написано в документе? Я чувствую, что не получил его должным образом. Просим руководствоваться, чтобы модель контроллера соответствовала заявлению о нескольких обработчиках по умолчанию.

Спасибо, Амит

ответ

26

Если у вас есть контроллер, как указано ниже, все, кроме /book/edit запросы будут направлены на mydefault() пока /book/edit будет отправлено 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!"; 
    } 
} 

В вашем примере у вас есть два метода без явного сопоставления пути.

+0

'mydefault()' будет обрабатывать/записывать только not/book/abc. –

+0

Arun, 'Если у вас несколько таких методов по умолчанию ...'. Можно ли настроить несколько методов по умолчанию? –

+0

Что вы подразумеваете под несколькими стандартами? В любом дизайне будет только один по умолчанию –

5

Arun, ваш ответ верен с предостережением, что весной 3.1 зависит от того, какая из пар HandlerMapping-HandlerAdapter настроена.

Описанное поведение поддерживается с DefaultAnnotationHandlerMapping & AnnotationMethodHandlerAdapter, которые были в использовании, поскольку Spring 2.5 и по-прежнему включен по умолчанию, когда не определены никакие другие HandlerMapping и HandlerAdapter бобы.

RequestMappingHandlerMapping and RequestMappingHandlerAdapter, добавленный в Spring 3.1 (см. Справочные документы Spring 3.1) в качестве замены для прежних, не поддерживает одно и то же поведение, то есть отступает от имени метода в случае двусмысленных сопоставлений, а также имеет метод по умолчанию (когда не определены явные сопоставления). Новая пара HandlerMapping-HandlerAdapter включена по умолчанию из пространства имен MVC и из конфигурации MVC Java и рекомендуется для дальнейшего использования.

Документ Java, на который ссылается Арун, нуждается в обновлении. Я создал билет для этого SPR-9042.

+0

Привет, Rossen. Не могли бы вы немного пояснить оператор 'enabled по умолчанию из пространства имен MVC' - вы имеете в виду тег' 'или тег регистрирует только еще одну пару HandlerMapping/HandlerAdapter? –

+0

Также вы можете посмотреть http://stackoverflow.com/questions/13671776/spring-mvc-why-this-hello-world-run-well-without-annotation-driven-tag-unlike-a - в этом вопрос: контроллер аннотируется только с помощью «@Controller», в то время как его единственный метод аннотируется «@RequestMapping («/hello »). Я правильно понимаю, что эта конфигурация будет работать только в версиях версии 3.1 (без' ') из-за изменений в Spring 3.1? –

 Смежные вопросы

  • Нет связанных вопросов^_^