2010-02-04 77 views
1

所以,我正在加速對澤西島,並有一個「最佳實踐」的問題。應該如何嚴格地將資源自包含在一個文件中。如果需要,一個資源類應該引用另一個類嗎?Jersey資源類交互?

舉例:

我有一個Person資源和一個Appointment Resource。 (即:/人/ 1 & /約會/ 12345)。我也可以做一些像/人/ 1 /約會列出人1的所有約會。

所以,我的問題是我應該實現一個方法getPersonAppointments()在人力資源類,或只是有人得到一個參考到Appointment資源類並調用該方法,保留所有返回「約會」的方法。

我不知道,有一個正確的或錯誤的方式。

回答

1

由於預約有多個的人,一個人有多個約會,情況是對稱的,你必須刺破人員和約會之間的障礙。

0

你的REST API應該簡化對資源的訪問。 REST的原理之一是「超媒體作爲應用程序狀態引擎」的思想,它傾向於通過它們的URI將客戶端引導到相關資源,以便客戶端不需要知道如何構建某些資源的URI先驗。在這裏

的更多信息:http://en.wikipedia.org/wiki/HATEOAS

的請求/人/ 1應該返回關於這個人的資料,包括任命的URI的集合。客戶端然後可以請求這些URI中的任何一個來獲取關於每個約會的信息。實施/人員/ 1 /任命是多餘的。

0

在你的情況我會把邏輯加載的人約會在一個資源並使其從其他資源訪問(換句話說委派資源,有什麼我假設你已經這樣做)。實際的邏輯存儲在AppointmentService中,因此您可以將它與getPersonAppointments()一起使用。

這樣你就可以把它叫做:

  • /人/ 1 /約會
  • /約會PERSONID = 1

兩個導致進入同樣的反應? 這可能不是最佳實踐,但邏輯集中在一個地方,使其更具可讀性和可重用性。

@Path("person") 
public class PersonResource {  
    @GET 
    @Path("{personId: [0-9]+}/appointments") 
    public AppointmentsResource loadAppointmentsForPerson(@PathParam("personId") Long personId) { 
     return new AppointmentsResource(personId); 
    } 
} 

@Path("apointments") 
class AppointmentResource { 

    private AppointmentService service;  
    private Long personId; 

    public AppointmentResource() { 
    } 

    public AppointmentResource(Long personId) { 
     this.personId = personId; 
    } 

    @GET 
    public Response loadAppointmentsForPerson(@QueryParam("personId") Long personId) { 

     Long personIdToUse = null; 
     if (this.personId != null) { 
      personIdToUse = this.personId; 
     } else if (personId != null) { 
      personIdToUse = personId; 
     } else { 
      //no input, bad request 
     } 

     List<Appointment> appointments = service.getPersonAppointments(personIdToUse) 
     //create your response from appointments 
    } 
} 

當然,在你的AppointmentResource中,你會有另一個東西,比如通過特定ID加載約會。