Spring MVC 3: обнаружено неоднозначное отображение

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

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.

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

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

Ответы

Ответ 1

Если у вас есть контроллер, как указано ниже, все запросы, отличные от /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!";
    }
}

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

Ответ 2

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

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

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

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