Han*_*kCa 3 java rest jax-rs jersey moxy
我正在尝试@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
}
Run Code Online (Sandbox Code Playgroud)
服务器收到/客户端发送对象:
@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
}
Run Code Online (Sandbox Code Playgroud)
客户(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);
}
Run Code Online (Sandbox Code Playgroud)
泽西邮报方法:
@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();
}
Run Code Online (Sandbox Code Playgroud)
调试:
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
Run Code Online (Sandbox Code Playgroud)
第2行 - clusterPost - in - 显示TweetQuery正在被正确编组.第3行 - clusterPost - out - 显示要发送的tweetClusters,因为响应实体存在第4行 - tweetClusters未出现在请求中
编辑
我更改了REST方法以返回它作为输入接收的tweetQuery并正确返回.关于TweetClusters的一些东西.也许我需要一个MessageBodyReader&Writer.或者Moxy @XmlJavaTypeAdapter.但是因为Lists显然可以像TweetQuery一样开箱即用.
/sf/users/26870301/你在外面吗?:)
我错过了一些简单的事吗?
我已经解决了.我无意中告诉了一个猪肉馅饼.当我说我有塞特里克斯和吸气剂时,我正在为TweetClusters设置器.然后一旦修复我有一个带有参数但没有no-arg构造函数的构造函数.一旦no-arg构造函数添加它就会很好.
总而言之,您需要在(un)marshalled中包含对象:
如果你有更复杂的类型,包括日期和日历,你需要有一个适配器@XmlJavaTypeAdapter(Moxy)或@JsonSerialize.using杰克逊(或RESTeasy中的???).
有趣的是,我不需要@XmlRootElement(Moxy)虽然保持良好的措施.
完整的答案是:
(un)编组的对象类是:
@XmlRootElement public class TweetClusters {List 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);
}
Run Code Online (Sandbox Code Playgroud)
}
public class TweetCluster {List labels = new ArrayList <>(); 列出docs = 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);
}
Run Code Online (Sandbox Code Playgroud)
}
public class TweetQuery {String query;
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);
}
Run Code Online (Sandbox Code Playgroud)
}
(Arghhh,抱歉格式化;我无法在SO中修复它)
出于调试目的,通常可以返回从响应返回的字符串表示(即XML或JSON),并且只需将实体类型指定为String.class:
String x = response.readEntity(String.class);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11015 次 |
| 最近记录: |