JAXB到JSON(反之亦然)如何使用Jersey工作?

时间:2011-03-10 01:21:35

标签: json rest jaxb jersey

我已经成功实现了一个与我自己的客户端一起工作的restful服务。现在,我希望将其作为其他客户也可以与之交互的服务。通过这种方式,我提出了以下问题:(我的代码快照来自我的问题,系统可以正常使用我的代码)

1-服务器和客户端之间传输的数据如何?考虑到我没有使用任何其他JAXB注释(例如@XMLElement)。有没有办法可以看到生成的JSON?

2- JAXB应该是'用于XML绑定的Java体系结构',因此,它是将数据作为XML或JSON发送(考虑到我已将请求类型指定为json)?或者,它是将对象转换为XML然后转换为客户端中的JSON,还是在服务器中,它是否获取JSON并将其转换为XML然后转换为Java对象?

3-我在我的客户端使用JAXB,但我的服务器应该得到一个json请求。是否意味着任何其他客户端如果生成带有“key”和“value”对的json可以与我的服务器交互?或者,它是否强制每个客户端使用JAXB(考虑到我的服务器中的方法具有特定对象JAXBBean的输入参数)?不幸的是,我目前不知道如何在不使用JAXB的情况下在Java中创建和发送json!所以,在问之前我无法测试这个问题。我稍后会学习它。

我的部分代码:

我用泽西岛来实现我的宁静服务。在客户端,我向服务器发送带有JAXB对象列表的帖子消息。每个JAXB对象都是这样注释的bean实例:

@XmlRootElement
public class JAXBBean {

String key;
String val;

//setters and getters (with no annotation) come here
...
}

我使用以下命令将List发送到服务器:

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();
            ...
    }
    ...
}

谢谢!

2 个答案:

答案 0 :(得分:0)

1-您可以使用浏览器下载JSON响应,并使用简单的短信(validate and format JSON)进行查看。
2-否,Jersey JSON提供程序使用Jackson直接在JSON中将对象序列化/反序列化并返回到Java对象。
3-是的,每个客户都能够阅读您的JSON响应。

答案 1 :(得分:0)

泽西岛利用Jettison库来实现这一目标。 Jettison将JSON转换为/从StAX转换,由JAXB实现处理: