【发布时间】:2011-03-10 01:21:35
【问题描述】:
我已经成功实现了一项适用于我自己的客户的宁静服务。现在,我希望使它成为其他客户也可以与之交互的服务。这样,我得出以下问题:(我的代码的快照出现在我的问题之后,系统与我的代码配合得很好)
1- 服务器和客户端之间传输的数据是什么样的?考虑到我没有使用任何其他 JAXB 注释(例如 @XMLElement)。有没有办法可以看到生成的 JSON?
2- JAXB 应该是“Java Architecture for XML Binding”,那么,它是以 XML 还是 JSON 格式发送数据(考虑到我已将请求类型指定为 json)?或者,它是否在客户端将对象转换为 XML,然后再转换为 JSON,在服务器中,它是否获取 JSON 并将其转换为 XML,然后再转换为 Java 对象?
3- 我在我的客户端中使用 JAXB,但我的服务器应该得到一个 json 请求。这是否意味着任何其他客户端如果它生成带有“键”和“值”对的 json 可以与我的服务器交互?或者,它是否强制每个客户端使用 JAXB(考虑到我在服务器中的方法具有特定对象 JAXBBean 的输入参数)?不幸的是,我目前不知道如何在不使用 JAXB 的情况下在 Java 中创建和发送 json!所以,在问之前我无法测试这个问题。我以后会学习它。
我的部分代码:
我使用 Jersey 来实现我的宁静服务。在客户端,我将带有 JAXB 对象列表的 post 消息发送到服务器。每个 JAXB 对象都是一个 bean 的实例,注释如下:
@XmlRootElement
public class JAXBBean {
String key;
String val;
//setters and getters (with no annotation) come here
...
}
然后我通过以下方式将列表发送到服务器:
String response = (String) publishWR.type("application/json").post(String.class, new GenericEntity<List<JAXBBean>> (reqArr){});
// publishWR is of type: com.sun.jersey.api.client.WebResource
// reArr is of type: List<JAXBBean>
在服务器端,我有一个方法可以回答这个网络资源上的发布请求,它是这样写的:
@POST
@Consumes("application/json")
public String postAnnotation(List<JAXBBean> requestArr){
String anno = "";
String user = "";
...
for(int i = 0 ; i < requestArr.size() ; i++ ){
if( requestArr.get(i).getKey().equals("annotation") )
anno = requestArr.get(i).getVal();
else if( requestArr.get(i).getKey().equals("username") )
user = requestArr.get(i).getVal();
...
}
...
}
谢谢!
【问题讨论】:
-
无法帮助您处理泽西岛。如果你想知道 CXF 如何与 Jackson 和 JAXB 一起做这件事,我可以告诉你。