gpt4 book ai didi

java - jax-rs Jersey @Post 响应实体为空

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:27:43 25 4
gpt4 key购买 nike

我正在尝试@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 -- 显示响应实体存在时要发送的 tweetClusters第 4 行 - tweetClusters 未从请求中出来


编辑

我更改了 REST 方法以返回它作为输入接收的 tweetQuery,并且它已正确返回。所以它是关于 TweetClusters 的。也许我需要一个 MessageBodyReader & Writer。或者 Moxy @XmlJavaTypeAdapter。但是对于列表来说,显然开箱即用,就像 TweetQuery 一样。

https://stackoverflow.com/users/383861/blaise-doughan你在外面吗? :)

我是不是漏掉了一些简单的东西?

最佳答案

好的,我解决了。我无意中告诉了 pig 肉馅饼。当我说我有 setter 和 getter 时,我错失了 TweetClusters 的 setter。然后一旦修复,我就有了一个带参数但没有无参数构造函数的构造函数。一旦添加了无参数构造函数,一切都很好。

总而言之,您需要在对象中进行(未)编码:

  1. 一个无参数的构造函数,如果你有一个带参数的构造函数
  2. 所有元素的 Setter 和 getter

如果您有更复杂的类型,包括 Date 和 Calendar,您需要在 Jackson(或 ?? ? 在 RESTeasy 中...)。

有趣的是,我不需要 @XmlRootElement (Moxy),尽管为了更好的衡量而将它放在那里。

完整的答案是:

  1. 客户端(Arquillian)测试同上
  2. Jersey Post方法同上
  3. (未)编码的对象类是:

    @XmlRootElement公共(public)类 TweetClusters { 列表 tweetClusters = new ArrayList<>();

    public void addCluster(Cluster c) {
    TweetCluster tweetCluster = new TweetCluster(c);
    tweetClusters.add(tweetCluster);
    }

    public List<TweetCluster> getTweetClusters() {
    return tweetClusters;
    }

    public void setTweetClusters(List<TweetCluster> tweetClusters) {
    this.tweetClusters = tweetClusters;
    }

    @Override
    public String toString() {
    return String.format("[TweetClusters:%s]", tweetClusters);
    }

    公共(public)类 TweetCluster { 列表标签 = new ArrayList<>(); 列表文档 = new ArrayList<>();

    public TweetCluster() {
    }

    public TweetCluster(Cluster c) {
    labels.add(c.getLabel());
    for (Document doc : c.getDocuments()) {
    docs.add(doc.getTitle());
    }
    }

    public List<String> getLabels() {
    return labels;
    }

    public void setLabels(List<String> labels) {
    this.labels = labels;
    }

    public List<String> getDocs() {
    return docs;
    }

    public void setDocs(List<String> docs) {
    this.docs = docs;
    }

    @Override
    public String toString() {
    return String.format("[TweetCluster - labels: %s, docs:%s]", labels, docs);
    }

    公共(public)类 TweetQuery { 字符串查询;

    List<TweetQueryTweet> tweets = new ArrayList<>();

    public String getQuery() {
    return query;
    }

    public void setQuery(String query) {
    this.query = query;
    }

    public List<TweetQueryTweet> getTweets() {
    return tweets;
    }

    public void setTweets(List<TweetQueryTweet> tweets) {
    this.tweets = tweets;
    }

    public void addTweets(TweetQueryTweet... queryTweets) {
    for (TweetQueryTweet tweet : queryTweets) {
    this.tweets.add(tweet);
    }
    }

    @Override
    public String toString() {
    return String.format("[TweetQuery - query:%s, tweets:%s]",query, tweets);
    }

(啊啊啊,对格式化感到抱歉;我无法在 SO 中修复它)

出于调试目的,通常最好取回响应返回的字符串表示形式(即 XML 或 JSON),您只需将实体类型指定为 String.class:

String x = response.readEntity(String.class);

关于java - jax-rs Jersey @Post 响应实体为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19534564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com