2015-12-14 143 views
2

我正在編寫一個Web API服務器,它提供三種相關類型的資源:作者,組和通道。每個通道必須正好一個作者或團體所擁有和訪問控制是通過請求用戶的作者或組問題關係決定的,所以我計劃建立類似的URL結構:Spring Web MVC中的嵌套控制器

  1. GET /作家/ {AUTHORID} - 查看特定作者
  2. POST /作者/ {AUTHORID} /信道 - 建立屬於該作者
  3. GET /作者/ {AUTHORID} /信道的信道 - 屬於該作者列表通道
  4. GET/authors/{authorId}/channels/{channelId} - 查看屬於該作者的特定頻道
  5. GET /組/ {的groupId} - 查看特定組
  6. POST /組/ {的groupId} /信道 - 建立屬於該組
  7. GET /組/ {的groupId} /信道的信道 - 屬於列表通道該組
  8. GET /組/ {的groupId} /信道/ {的channelID} - 查看屬於該組

特定信道完成的服務器將具有用於處理與作者,團體和信道有更多的路徑;這些是作爲例子給出的。

嘗試在Spring Web MVC中使用三個控制器(即AuthorsController,GroupsController,ChannelsController)做到這一點是否合理?我將如何使用RequestMapping註釋將它們連接在一起?有沒有一種方法可以分解這些在Spring Web MVC中更有意義的責任,但仍然保持凝聚力?

N.B.我看過a similar question asked,但問題和答案都集中在內部類。

回答

3

你應該基於「單一職責原則」組織班級:班級應該做「一件事」,不管是什麼。

在這種情況下,似乎有一個類如AuthorController來處理作者或組的HTTP機制通常會很好。這種控制器的映射會是這個樣子(Groovy中的簡單性和使用DomainClassConverter):

@RequestMapping('/authors') 
@RestController 
class AuthorController { 

    @RequestMapping('/{id}') 
    Author singleResource(@PathVariable Author id) { 
     id 
    } 
} 

現在你聽起來這似乎是它在多個類的相同的行爲的要求,像可能用於繼承,但是您也有一個對象,可以由多種所有者擁有,這聽起來像泛型的可能用法。

如果通道管理的邏輯在作者和組之間是相同的,那麼我建議使用abstract class ChannelController<O extends ChannelOwner>來處理所有的/channel映射;如果不同,那麼使ChannelController<O>爲一個接口,並且只聲明映射。

請注意,如果您使用Spring Security來處理授權,@RequestMapping annotations are inherited when you override/implement an abstract method, but @PreAuthorize and similar are not,所以安全註釋必須複製到最底層的實現類。您應始終使用MockMvc來確保您收到禁止訪問的適當禁止響應。