我正在尝试将GET请求中的值绑定到POJO。
值是HTTP GET请求中的参数。我正在使用JSONP传递参数,但看起来JSONP将JSON对象推送到Request行,因此它实际上不是正在发送的JSON对象,而只是在URL上命名值对。
是否可以将我的GET请求中的值映射到POJO?当我尝试绑定时,Jersey会给出以下异常
HTTP GET方法public void handleJSONP(MyPojo)不应该使用任何实体。
绑定代码正在寻找请求体,但它不存在,因为它是一个GET请求。有没有其他方法可以绑定请求中的值而无需为每个值手动包含@QueryParam条目?
由于
答案 0 :(得分:7)
我可以使用@com.sun.jersey.api.core.InjectParam的球衣来解决这个问题
public JSONWithPadding doSomething(@InjectParam final MyPojo argPojo)
然后Pojo看起来像这样
public class MyPojo
{
/** */
@QueryParam("value1")
private String value1;
/** */
@QueryParam("value2")
private String value2;
/** */
@QueryParam("value3")
private List<String> value3;
答案 1 :(得分:4)
HTTP GET by specification包含URL中的参数 - 因此它只接受值对。所以,你要做的事情是不可行的。为什么不使用POST来将JSON对象与请求捆绑在一起?
答案 2 :(得分:2)
我提出了一个更加扩展的例子。
jQuery客户端:
var argPojo = {
callback:"myPojoCallback",
value1:"val1",
value2:"val2",
value3:["val1", "val2", "val3"]
};
var url = 'xxx.xx.xx.xx/testPojo';
$.ajax({
type: 'GET',
async: false,
jsonpCallback: argPojo.callback,
url: url,
data:argPojo,
contentType: "application/json",
dataType: 'jsonp',
beforeSend:function(){
console.log("sending:",argPojo);
},
success: function(response) {
console.log("reciving",response);
},
error: function(e) {
console.error("error",e);
}
});
在服务器上
@Path("testPojo")
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces("application/x-javascript")
public JSONWithPadding testPojo(@InjectParam MyPojo argPojo){
System.out.println(argPojo);
System.out.println(argPojo.callback);
System.out.println(argPojo.value1);
System.out.println(argPojo.value2);
System.out.println(argPojo.value3);
return new JSONWithPadding(argPojo, argPojo.callback);
}
the actual class object
public class MyPojo {
@QueryParam("callback")
public String callback;
@QueryParam("value1")
public String value1;
@QueryParam("value2")
public String value2;
@QueryParam("value3[]")
public List<String> value3;
public MyPojo(){}
}
chrome console result
sending: Object
callback: "myPojoCallback"
value1: "val1"
value2: "val2"
value3: Array[3]
__proto__: Object
receiving Object
callback: "myPojoCallback"
value1: "val1"
value2: "val2"
value3: Array[3]
__proto__: Object
答案 3 :(得分:0)
GET请求不能消耗任何实体。 而是使用POST或PUT方法(提供的请求是插入或更新)。 否则,请使用标准方法在URL中传递属性。
答案 4 :(得分:0)
由于我们知道GET请求不能使用任何实体,因此我们需要将每个参数作为参数传递。为简单起见,我们可以使用javax.ws.rs.BeanParam
进行以下操作
(我们可以使用@BeanParam
代替@InjectParam
public JSONWithPadding doSomething(@BeanParam final MyPojo argPojo)
....
public class MyPojo
{
/** */
@QueryParam("value1")
private String value1;
/** */
@QueryParam("value2")
private String value2;
/** */
@QueryParam("value3")
private List<String> value3;