3

ユーザーが作成したオブジェクトを @POST して、別のユーザーが作成したペイロードをエンティティとして持つレスポンスを取得しようとしています。返されたオブジェクトは存在し、入力されていますが、クライアント側では空です。

クライアント送信/サーバー受信オブジェクト:

@XmlRootElement
public class TweetQuery {
    String query;
    List<TweetQueryTweet> tweets = new ArrayList<>();
    // setters and getters
}

public class TweetQueryTweet {
    private String id;
    private String text;
    // setters and getters
}

サーバーが受信した/クライアントが送信したオブジェクト:

@XmlRootElement
public class TweetClusters {
    List<TweetCluster> tweetClusters = new ArrayList<>();
    // setters and getters
}

public class TweetCluster {
    List<String> labels = new ArrayList<>();
    List<String> docs = new ArrayList<>();
    // setters and getters
}

クライアント (Arquillian) テスト:

@Test
@RunAsClient
public void test01SeeSomething(@ArquillianResource URL deploymentUrl) throws ... {

    final URI targetURI = ...;
    System.out.println("    test target:" + targetURI.toASCIIString());

    Entity<TweetQuery> tweetQuery = Entity.entity(getTestTweetQuery(), MediaType.APPLICATION_JSON);

    Client client = ClientBuilder.newBuilder().build();
    WebTarget target = client.target(targetURI.toASCIIString());

    Response response = target.request(MediaType.APPLICATION_JSON).post(tweetQuery);

    TweetClusters x = response.readEntity(TweetClusters.class);
    System.out.println("Entity:" + x);
    System.out.println("Response: " + response.getStatus());
    assertEquals(Status.OK.getStatusCode(), response.getStatus());
    assertNotNull(x);
    assertThat(x.getTweetClusters().size()).isGreaterThan(0);
}

ジャージーポスト方式:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response clusterPost(TweetQuery tweetQuery) {
    TweetClusters tweetClusters = clusterService.getTweetClusters(tweetQuery);
    System.out.println("clusterPost - in - tweetQuery: " + tweetQuery);
    System.out.println("    - out tweetClusters: " + tweetClusters);
    return Response.status(Status.OK).type(MediaType.APPLICATION_JSON).entity(tweetClusters).build();
}

デバッグ:

test target:http://localhost:18080/test//cluster

clusterPost - in - tweetQuery: [TweetQuery - query:TweetQuery query, tweets:[[TweetQueryTweet - id:1, text:text 1], [TweetQueryTweet - id:2, text:text 2], [TweetQueryTweet - id:3, text:text 3]]]
    - out tweetClusters: [TweetClusters:[[TweetCluster - labels: [Other Topics], docs:[3, 2, 1]]]]
Entity:[TweetClusters:[]]
Response: 200

2 行目 - clusterPost - in -- TweetQuery が適切にマーシャリングされていることを示しています。3 行目 - clusterPost - out -- Response エンティティが存在するため送信される tweetClusters を示しています 4 行目 - tweetClusters はリクエストから出ていません


編集

入力として受け取った tweetQuery を返すように REST メソッドを変更したところ、正しく返されました。つまり、TweetClusters についてです。多分私は MessageBodyReader & Writer が必要です。またはMoxy @XmlJavaTypeAdapter。しかし、TweetQueryが機能するように、Listsは明らかに箱から出して機能します。

https://stackoverflow.com/users/383861/blaise-doughanあなたはそこにいますか? :)

簡単なものがありませんか?

4

3 に答える 3

1

次のようなレスポンスを返すようにしてください: Response.ok(tweetClusters).build();

于 2013-10-23T10:07:14.423 に答える
0

@XmlRootElements でアノテーションが付けられたモデルを持っている理由がわかりません。したがって、それを削除して、ジャクソンを使用してリクエストとレスポンスの本文をシリアライズおよびデシリアライズすることができると思います。私はあなたがgsonであると思います。

于 2013-10-23T06:54:45.640 に答える