使用 Jersey 和 ExtJS 消耗 JSON 的 Rest Web 服务

Rest web service consuming JSON using Jersey and ExtJS

我正在尝试实施 Jersey 框架,以便使用 restful 方法路由我们的客户端请求。我已经成功地创建了读取原始参数、发送它们的方法,它们甚至可以用来自对象的 JSON 进行响应。然而,我无法做的一件事是从 post/put 读取(即消费)一个 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());
}

我的 Status 对象也是:

@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;
    }
}

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

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

A message body reader for Java class javax.xml.bind.JAXBElement, and Java type javax.xml.bind.JAXBElement, and MIME media type application/json was not found.

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

我在这里寻找的是一个可用的解决方案: 球衣 1.19 ExtJS 5 JDK 6 WebLogic 10.X

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

编辑:我什至在我的 web.xml 中添加了 POJO 映射(我在网上发现球衣需要支持 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

我找到了解决问题的办法。需要进行几项更改:

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

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

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

最后 Status class 不需要 @XmlRootElement 注释。但是,它需要在其默认(空)构造函数上添加 @JsonCreator 注释。