2012-01-18 110 views
15

我在玩Spring 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!"; 
    } 
} 

這裏是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. 

現在的問題這個控制器是模擬文檔中寫入的內容嗎?我覺得我沒有得到正確的。請指導我對控制器進行建模以匹配關於多個默認處理程序的聲明。

謝謝,阿米特

回答

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()'將處理/ book only not/book/abc。 –

+0

Arun,'如果你有多種這樣的默認方法......'。是否可以配置多個默認方法? –

+0

你是什麼意思的多個默認值?在任何設計中只會有一個默認的 –

5

Arun,你的回答是正確的,在Spring 3.1中它取決於哪個HandlerMapping-HandlerAdapter配置。

所描述的行爲受該DefaultAnnotationHandlerMapping & AnnotationMethodHandlerAdapter上已投入使用以來Spring 2.5中,並仍在默認啓用沒有其他的HandlerMapping和豆類的HandlerAdapter定義的時候。

在Spring 3.1(請參閱Spring 3.1參考文檔)中添加的RequestMappingHandlerMapping和RequestMappingHandlerAdapter替代前者不支持相同的行爲 - 即在模糊映射的情況下回退方法名稱以及具有默認方法(當沒有定義顯式映射時)。新的HandlerMapping-HandlerAdapter對默認從MVC命名空間和MVC Java配置啓用,並推薦用於未來的使用。

Arun引用的Java文檔需要更新。我爲這個SPR-9042創建了一張票。

+0

中添加了mvc配置Hi,Rossen。您能否澄清一下'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的變化? –