使用 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
注释。
我正在尝试实施 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
注释。