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>
を渡し、
ChilsResource.something
に行きます'..? – Noushad