在Jersey Rest中使用@Consume和GET请求

时间:2012-04-03 12:56:54

标签: jsonp jersey jackson

我正在尝试将GET请求中的值绑定到POJO。

值是HTTP GET请求中的参数。我正在使用JSONP传递参数,但看起来JSONP将JSON对象推送到Request行,因此它实际上不是正在发送的JSON对象,而只是在URL上命名值对。

是否可以将我的GET请求中的值映射到POJO?当我尝试绑定时,Jersey会给出以下异常

HTTP GET方法public void handleJSONP(MyPojo)不应该使用任何实体。

绑定代码正在寻找请求体,但它不存在,因为它是一个GET请求。有没有其他方法可以绑定请求中的值而无需为每个值手动包含@QueryParam条目?

由于

5 个答案:

答案 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;