使用Jersey和ExtJS休息使用JSON的Web服务

时间:2015-04-03 12:44:23

标签: java json rest extjs jersey

我正在尝试实现Jersey框架,以便使用restful方法路由我们的客户端请求。我已成功创建了读取原始参数的方法,发送它们,甚至可以使用对象的JSON进行响应。然而,我无法做的一件事是从post / put甚至get请求中读取(即消耗)json对象。我已经尝试过我能在网上找到的所有内容,但无济于事。由于一些工作问题,我被限制使用Java 6和Jersey 1.19。另外,对于我们的客户端,我们正在使用ExtJS。

我的ExtJS请求格式如下:

Ext.Ajax.request({
url: 'rest/RestClass/getMessage',
method: 'PUT',
header: {
    'Content-Type': 'application/json'
},
jsonData: {
    status: {
        id: 1,
        description: 'Description'
    }
},
success: function(response) {
    var result = response.responseText;
},
failure: function(response) {
    Ext.Msg.alert('Communication Error', 'Failed');
}
});

就我的后端事情而言,我有这个:

@PUT
@Path("/getMessage")
@Consumes(MediaType.APPLICATION_JSON)
public void getMsg(JAXBElement<Status> status) {
    System.out.println("status id = " + status.getValue().getId());
    System.out.println("status description = " + status.getValue().getDescription());
}

我的状态对象是:

@XmlRootElement
public class Status{

    private int id;
    private String description;

    public Status() {

    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}

我已经正确映射了jersey servlet等,因为我已经发送了成功的请求。我的问题是当我尝试在参数中发送一个带有json对象的错误时。

起初我错过了jackson库的错误,即使我使用的jersey-bundle-1.19.jar包含了所需的所有内容。下载jackson-jaxrs-1.9.13.jar并将其添加到项目后,我现在收到此错误:

  

Java类javax.xml.bind.JAXBElement的消息体阅读器,以及   Java类型   javax.xml.bind.JAXBElement,   找不到MIME媒体类型application / json。

我甚至添加了一些jaxb罐以防万一但仍然得到相同的错误。我在网上看到的很多例子都不适用于我。他们都使用maven进行依赖控制,我们无权访问,所以我无法确定我们是否使用相同的库...

我在这里寻找的是一个解决方案,我可以提供的东西: 球衣1.19 ExtJS 5 JDK 6 WebLogic 10.X

目标是能够以JSONObject作为参数发送请求,并将服务器端解码为现有对象类型。

编辑:我甚至在我的web.xml中添加了POJO映射(我发现在线需要jersey来支持json / object映射)

<init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

还有同样的问题。客户给我一个415 error for unsupported media type

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。需要进行一些更改:

在请求的jsonData对象中,不应该有status root属性。只是对象本身:

jsonData: {
    id: 1,
    description: 'Description'
},

我还从我方法的声明中删除了JAXBElement<Status>。它只会收到一个Status status对象。

最后,Status class不需要@XmlRootElement注释。然而,它需要@JsonCreator注释超过其默认(空)构造函数。