3

Web サービスに JAX-RS の jersey 実装を使用しています。私はこのJAX-RSに非常に慣れていません。

Employee オブジェクトを受け入れ、Employee オブジェクトの値に基づいて従業員 ID を返すサービスにメソッドを追加しようとしています (これには DB ヒットがあります)。

Restful の原則に従って、メソッドを @GET として作成し、以下に示すように URL パスを指定しました。

@Path("/EmployeeDetails")
public class EmployeeService {
@GET
@Path("/emp/{param}")
public Response getEmpDetails(@PathParam("param") Employee empDetails) {

    //Get the employee details, get the db values and return the Employee Id. 

    return Response.status(200).entity("returnEmployeeId").build();

}
}

テスト目的で、私はこのクライアントを書きました:

public class ServiceClient {

public static void main(String[] args) {

    ClientConfig config = new DefaultClientConfig();
    Client client = Client.create(config);
    WebResource service = client.resource(getBaseURI());

    Employee emp = new Employee();
    emp.name = "Junk Name";
    emp.age = "20";
    System.out.println(service.path("rest").path("emp/" + emp).accept(MediaType.TEXT_PLAIN).get(String.class));

}

private static URI getBaseURI() {
    return UriBuilder.fromUri("http://localhost:8045/AppName").build();
}

}

実行すると、次のエラーが表示されます。Method, public javax.ws.rs.core.Response com.rest.EmployeeService.getEmpDetails(com.model.Employee), annotated with GET of resource, class com.rest.EmployeeService, is not recognized as valid resource method.

編集:

モデル:

package com.model;

public class Employee {

public String name;
public String age;

}

問題がどこにあるのか教えてください。私はこれの初心者で、概念を理解するのに苦労しています:(

4

3 に答える 3

6

EmployeeJAX-RS は @PathParam (文字列値) をオブジェクトに自動的に変換できません。@PathParam から自動的に作成できるオブジェクトの要件は次のとおりです。

  1. 文字列 (デファクト、データは既に文字列であるため)
  2. (単一の) 文字列を引数として受け入れるコンストラクタを持つオブジェクト
  3. 静的valueOf(String)メソッドを持つオブジェクト

ケース 2 と 3 の場合、オブジェクトは文字列データを解析して内部状態を設定する必要があります。これは通常は行われません (データのコンテンツ タイプに関する仮定を行う必要があるため)。あなたの状況 (JAX-RS の学習を始めたばかり) では、受信 @PathParam データを String (または Integer、または Long) として受け入れるのが最善です。

@GET
@Path("/emp/{id}")
public Response getEmpDetails(@PathParam("id") String empId) {
    return Response.status(200).entity(empId).build();
}

複雑なオブジェクト表現を GET メソッドで REST サービスに渡すことは、検索フィルターなどとして使用されない限り、あまり意味がありません。あなたのフィードバックに基づいて、それがあなたがやろうとしていることです。私は実際に以前にプロジェクトでこれを行ったことがあります(検索フィルターの一般的な実装)。1つの注意点は、検索データの形式を厳密に定義する必要があることです。では、JSON を受け入れられる形式として定義しましょう (必要に応じて例を他の形式に適合させることができます)。「検索オブジェクト」は、 というクエリ パラメータとしてサービスに渡されますfilter

@GET
@Path("/emp")
public Response getEmployees(@QueryParam("filter") String filter) {
    // The filter needs to be converted to an Employee object. Use your
    // favorite JSON library to convert. I will illustrate the conversion
    // with Jackson, since it ships with Jersey
    final Employee empTemplate = new ObjectMapper().readValue(filter, Employee.class);

    // Do your database search, etc, etc
    final String id = getMatchingId(empTemplate);

    // return an appropriate response
    return Response.status(200).entity(id).build();
}

そして、あなたのクライアントクラスで:

final String json = new ObjectMapper().writeValueAsString(emp);
service
    .path("rest")
    .path("emp")
    .queryParam("filter", json)
    .accept(emp, MediaType.TEXT_PLAIN)
    .get(String.class)
于 2013-02-22T13:28:35.880 に答える
3

同じ問題が発生しましたが、アプリケーションで使用されるジャージー jar が同じバージョンである必要があることを修正しました。

于 2014-09-15T11:15:04.537 に答える
1

エンティティ (従業員) を URL パス セグメントにシリアル化したいというのは、非常に奇妙です。不可能だと言っているわけではありませんが、奇妙です。次に、Employeeクラスが次の基準を満たしていることを確認する必要があります (これは のjavadoc からのものです @PathParam) 。

注釈付きのパラメーター、フィールド、またはプロパティの型は、次のいずれかでなければなりません:
... (無関係な部分)
単一の String 引数を受け入れるコンストラクターを持っている。
単一の文字列引数を受け入れる valueOf または fromString という名前の静的メソッドを用意します (たとえば、Integer.valueOf(String) を参照)。

Employeeパス パラメータではなく、リクエスト本文でオブジェクトを渡したい場合があります。これを実現するには、Employeeクラスに で注釈を付け、メソッドの引数から注釈を@XmlRootElement削除し、@GET を @POST に変更します。@PathParamempDetails

于 2013-02-22T13:29:41.223 に答える