2013-12-11 30 views
16

我遇到了控制器中的一個方法。這是什麼ID:。+ ??在Spring MVC的requestmapping處理方法中,{id:。+}是什麼意思?

@RequestMapping(value="/index/{endpoint}/{type}/{id:.+}", method=RequestMethod.POST, consumes=kContentType, produces=kProducesType) 
@ResponseBody 
public String indexData(@PathVariable(value="endpoint") String endpoint, @PathVariable(value="type") String type, @PathVariable(value="id") String id, @RequestBody String body, HttpServletRequest request) { 
    logger.debug("In web controller for endpoint " + endpoint); 
    return indexController.indexData(endpoint, type, id, body, getSecurityContextProvider(request)); 
} 

回答

18

在彈簧MVC控制器請求映射中,路徑變量的語法是{variable_name:regular_expression}。您可以選擇省略正則表達式,這會導致您經常看到的內容,{id}

因此,對於示例/index/{endpoint}/{type}/{id:.+},變量名稱爲id,正則表達式爲.+(請參閱下面的參考spring文檔)。

正則表達式.+指出「一次或多次匹配元字符.」。 '。'元字符表示包括空格在內的任何字符(儘管有些實現不符合換行符)。請參閱http://en.wikipedia.org/wiki/Regular_expression

正則表達式正被用於幫助Spring確定變量的值,因爲您可以具有複雜的變量名稱,或者在路徑末尾可能存在其他重要信息,否則該信息會被吸入變量值如果Spring只是說「直到路徑的末尾」(例如文件擴展名或路徑變量)。

在您的示例中,id變量可能包含特殊字符,否則會導致Spring過早終止變量。在嘗試使用包含文件擴展名(foobar.jpg)的文件名時,我遇到過這個問題。 Spring將只返回變量的「foobar」部分,因爲Spring假設我希望它在週期分隔符處終止變量值。因此,在這種情況下,爲了確保「id」與完整值相匹配,可以將正則表達式告訴Spring繼續前進,並匹配最後一個正斜槓和路徑末尾之間的所有內容。 SO參考:Spring MVC @PathVariable getting truncated

這裏是從Spring文檔與複雜的可變匹配交易的摘錄:

有時候你需要更精確的定義URI模板變量。考慮URL「/spring-web/spring-web-3.0.5.jar」。你如何將它分解成多個部分?

@RequestMapping註釋支持在URI模板變量中使用正則表達式。語法是{的varName:正則表達式}。其中,所述第一部分限定的變量名稱和所述第二 - 正則表達式」

這裏是它們的(相當複雜的)例如:

@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]+}") 
public void handle(@PathVariable String version, @PathVariable String extension) { 
    // ... 
} 

來源:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html

他們提供展示瞭如何從請求執行復雜的映射到控制器,你將無法方法paramters的例子不使用正則表達式。

+0

你能提供一個可以用來打這個服務的url的例子? –

+0

「/index/foo/bar/foo.bar」將起作用。如果沒有id路徑變量的「。+」正則表達式,你只會得到「foo」的id,而不是「foo.bar」 – reblace

+0

我不太確定我跟着你reburs –