4

Apache CXF で記述された使用可能な REST API (API Y など) のラッパー REST API (API X など) を作成しています。ラッパーには CXF Webclient を使用しています。これが、X から Y を呼び出す方法です。

@GET
@Path("{userName}")
public Response getUser(@PathParam("userName") String userName) {
    try {
        WebClient client 
                   = WebClient.create("https://localhost:8080/um/services/um");
        Response response = client.path("users/" + userName)
                                  .accept(MediaType.APPLICATION_JSON)
                                  .get();
        User user = (User) response.getEntity();
        return Response.ok(user).build();
    } catch (Exception e) {
        return handleResponse(ResponseStatus.FAILED, e);
    }
}    

ここでは、Y を X の依存関係として使用できないため、User クラスは Y から X にコピーされます。唯一の違いはパッケージ名です。リクエストを送信すると、 でクラス キャスト例外が発生しUser user = (User) response.getEntity();ます。

java.lang.ClassCastException: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream cannot be cast to org.comp.rest.api.bean.User

クラスのパッケージ名が違うからでしょうか?

誰かが User オブジェクトへの応答を得るのを手伝ってくれませんか?

4

3 に答える 3

2

あなたの応答は JSON 形式のようですね。応答の JSON バイトのストリームを Java クラスに変換する必要があります。ストリーム クラスをユーザー クラスにキャストしようとしていますが、これは明らかに機能しません。JSON をデータ ストリームから解析し、JSON をユーザー クラスに逆シリアル化する必要があります。JacksonGSONなど、役立つライブラリがあります。

この男には、Jackson ObjectMapper クラスを使用した簡単な例があります。ObjectMapper クラスには、InputStream パラメーターを含むreadValue メソッドがあります。

于 2014-10-23T11:32:03.153 に答える
0

追加の操作を行う必要はありません。

GETメソッドの場合

 TypeOfObject response = client.path("users/" + userName)
                              .accept(MediaType.APPLICATION_JSON)
                              .get(TypeOfObject.class);

POSTメソッドの場合

TypeOfObject response = client.path("users/" + userName)
                              .accept(MediaType.APPLICATION_JSON)
                              .post(instatanceOfTypeOfObject, TypeOfObject.class);
于 2015-10-26T11:35:36.453 に答える