Spring MVC 3: найдено неоднозначное отображение - PullRequest
15 голосов
/ 18 января 2012

Я играю с 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.

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

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

Ответы [ 2 ]

26 голосов
/ 18 января 2012

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

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

5 голосов
/ 20 января 2012

Арун, ваш ответ правильный с оговоркой, что в Spring 3.1 это зависит от того, какая пара HandlerMapping-HandlerAdapter настроена.

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

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

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

...