2011-05-13 102 views
3

我正在爲一個webapp構建rest API,並且遇到了RequestMapping的問題。Spring MVC RequestMapping匹配錯誤的URL

Basicaly有用戶,它們被分組到不同的域中。當他們與系統一起工作時,一些信息被存儲在一個名爲「會話」的對象中並寫入數據庫。

我有以下網址:

1)http://server.com/api/v1/domain/ 則domainName /會話 - 顯示有關域中所有用戶的所有會話的信息。

2)http://server.com/api/v1/domain/ 則domainName /用戶/ 的userName /會話 - 顯示關於特定用戶的會話的信息。

我使用彈簧3.0.5,並已宣佈2個處理器在我的控制器類:

@RequestMapping(value = "/{domainId}/sessions", method=RequestMethod.GET) 
public void findSessions(@PathVariable final String domainId) { 
    ... 
} 

@RequestMapping(value = "/{domainId}/user/{username}/sessions", method=RequestMethod.GET) 
public void findUserSessions(
     @PathVariable final String domainId, 
     @PathVariable final String username) { 
    ... 
} 

我使用的是混合控制器的映射:指定SimpleUrlHandlerMapping建立+註釋

爲控制器基本路徑使用SimpleUrlHandlerMapping建立:

<property name="mappings"> 
    <value> 
    /api/v1/domain/** = api.DomainsController 
    </value> 
</property> 

的問題是,既URL由第一種方法處理。對於URL 2,用戶名綁定到domainId pathvariable,因此制動方法邏輯。

但是,如果我指定請求映射中的完整路徑 - 它工作正常。

@RequestMapping(value = "/api/v1/domain/{domainId}/sessions", method=RequestMethod.GET) 
@RequestMapping(value = "/api/v1/domain/{domainId}/user/{username}/sessions", method=RequestMethod.GET) 

回答

1

我認爲最好不要混合使用SimpleUriHandlerMapping和RequestMapping方法。我不認爲他們是爲了一起工作。

我想你想要的僅僅是/ api/v1/domain的一個級別的RequestMapping,然後是個別情況的方法級別映射。

所以,換句話說,除去SimpleUrlHandlerMapping建立條目,而是執行此操作:

@Controller 
@RequestMapping(value = "/api/v1/domain") 
public class DomainsController { 

@RequestMapping(value = "/{domainId}/sessions", method=RequestMethod.GET) 
public void findSessions(@PathVariable final String domainId) { 
    ... 
} 

@RequestMapping(value = "/{domainId}/user/{username}/sessions", method=RequestMethod.GET) 
public void findUserSessions(
     @PathVariable final String domainId, 
     @PathVariable final String username) { 
    ... 
} 

} 

這告訴Spring該控制器負責啓動與/ API/V1 /域的所有請求,然後方法級別要求映射是相對於此。

+1

好吧,這並不像刪除SimpleUrlHandlerMapping條目和添加@RequestMapping那麼簡單,但是在一些網絡谷歌搜索之後,我終於設法與他們離婚了。 (因爲還有其他的'傳統'控制器,我不能總體降低SUHM)。它現在可以正確使用DefaultAnnotationHandlerMapping – dvd 2011-05-16 12:57:47

+0

HI,您可以告訴我在RequestMapping URL中使用{}括號。 – 2016-11-09 10:31:03

+1

@AravindRPillai它們用於指定路徑變量。 – Willa 2017-03-08 16:05:04