Spring MVC 3:发现了模糊映射

时间:2012-01-18 11:40:44

标签: spring-mvc spring-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!";
    }
}

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

但似乎我搞砸了一些东西,因为它在部署时给了我以下错误:

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 个答案:

答案 0 :(得分: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!";
    }
}

在您的示例中,您有两种没有显式路径映射的方法。

答案 1 :(得分:5)

Arun,你的回答是正确的,在Spring 3.1中它需要配置哪个HandlerMapping-HandlerAdapter配对。

DefaultAnnotationHandlerMapping&amp; amp; AnnotationMethodHandlerAdapter,自Spring 2.5以来一直在使用,并且在没有定义其他HandlerMapping和HandlerAdapter bean的情况下仍默认启用。

在Spring 3.1中添加的RequestMappingHandlerMapping和RequestMappingHandlerAdapter(参见Spring 3.1参考文档)作为前者的替代,不支持相同的行为 - 即在模糊映射的情况下回退到方法名称以及具有默认值方法(未定义显式映射时)。默认情况下,新的HandlerMapping-HandlerAdapter对从MVC命名空间和MVC Java配置启用,建议继续使用。

Arun引用的Java文档需要更新。我为SPR-9042创建了一张票。