2016-10-15 10 views
1

Jerseyを使用してREST APIを実装しているWebアプリケーションがあります。ここでは、WebコンテナのID Tomcatの
は、APIの概要です:Jersey:サブ・サブ・リソースを取得できません

/rest/patients
は、患者のメタデータのリストを取得します。

/rest/patients/{id}
特定の患者に関する詳細なデータを取得します。

/rest/patients/{id}/visits
特定の患者の訪問数のメタデータのリストを取得します。

/rest/patients/{id}/visits/{visitId}
特定の患者の特定の訪問に関する詳細なデータを取得します。

私の問題は、サブサブリソースを取得できないということです。例えば、/rest/patients/1を要求すると、患者#1の詳細データが正しく受信されます。
しかし、私が/rest/patients/1/visitsを要求すると、404エラーが発生し、フローはgetVisits()メソッドにも入りません。
特定の患者IDのリクエスト(patients/{id})を受け取った場合、JerseyはPatientsMetadataResourceからPatientsResourceに正しく指示しているようです。
訪問サブサブリソースが要求されている場合(patients/{id}/visits)、JerseyはPatientsResourceに直接アクセスしません。

どのようにしてサブリソースとそのサブサブリソースをすべて同じクラスに誘導できますか? PatientsMetadataResourceため

コード(名前は少し曖昧であり、私はそれを変更する必要があります):PatientResourceため

@Path("/patients") 
public class PatientsMetadataResource { 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getPatients(@QueryParam("page") int pageIndex) { 
    //.... Loads, Builds and returns the patients' metadata list correctly 
    } 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    @Path("/{uid:\\d+}") 
    public PatientResource getPatient(@PathParam("uid") int uid) { 
     return new PatientResource(uid); 
    } 

} 

コード:

public class PatientResource { 

    private final int uid; 

    public PatientResource(int uid) { 
    this.uid = uid; 
    } 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getPatient() { 
    //Returns the patient correctly 
    System.out.println("A Patient was asked"); 
    Patient patient = PersistentDataProvider.loadPatientByUid(uid); 
    return Response.ok(patient).build(); 
    } 

    @GET 
    @Path("/visits") 
    @Produces(MediaType.APPLICATION_JSON) 
    public VisitsResource getVisits(@PathParam("uid") int patientUid) { 
    //The flow doesn't even enter here. A 404 is being returned instead. 
    System.out.println("Visits were asked"); 
    return new VisitsResource(patientUid); 
    } 
} 

コードweb.xmlのジャージー部分の:

<servlet> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <servlet-class> 
     com.sun.jersey.spi.container.servlet.ServletContainer 
    </servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>il.co.site_building.dvardy.resources</param-value> 
    </init-param> 
    <init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 
+0

を渡し、ChilsResource.somethingに行きます'..? – Noushad

答えて

2

サブリソースロケータはh aveのHTTPメソッドのアノテーション

// @GET <--- Remove this 
// @Produces(MediaType.APPLICATION_JSON) 
@Path("/{uid:\\d+}") 
public PatientResource getPatient(@PathParam("uid") int uid) { 
    return new PatientResource(uid); 
} 

彼らの主な目的は、GETない/ POSTの/ etc何でも、サブリソースクラスに要求を転送するだけです。 JerseyがそのHTTPメソッドアノテーションを見ると、サブリソースロケータとして扱われなくなりました。

また、IDを渡す必要はありません。これは、パスのparamを渡し、「親/ 1」ChildResource.getに行くGETとparent/1/somethingをGETここではそれに応じて

@Path("parent") 
class ParentResource { 
    @Path("{id}") 
    public ChildResource getChild() { 
     return new ChildResource(); 
    } 
} 

class ChildResource { 
    @GET 
    public Response get(@PathParam("id") long id) {} 

    @GET 
    @Path("something") 
    public Response something(@PathParam("id") long id) {} 
} 

渡されます `PatientResourceのルートリソース・パスでどのようなパスのparam

関連する問題