Использование @Consume с GET-запросом в Jersey Rest - PullRequest
4 голосов
/ 03 апреля 2012

Я пытаюсь привязать значения в GET-запросе к POJO.

Значения являются параметрами в HTTP-запросе GET.Я использую JSONP для передачи параметров, однако похоже, что JSONP помещает объект JSON в строку запроса, так что это на самом деле не объект JSON, который отправляется, а вместо этого просто имя пары значений в URL.

Можно ли отобразить значения в моем запросе GET в POJO?Джерси дает следующее исключение, когда я пытаюсь связать

Метод HTTP GET, public void handleJSONP (MyPojo), не должен потреблять никакой сущности.

Код привязки просматривается в теле запроса, однако онне существует, потому что это запрос GET.Есть ли другой способ связать значения в запросе без необходимости вручную включать запись @QueryParam для каждого?

Спасибо

Ответы [ 4 ]

7 голосов
/ 04 апреля 2012

Я смог решить эту проблему, используя @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;
4 голосов
/ 03 апреля 2012

HTTP GET по спецификации включает параметры в URL - поэтому он принимает только пары значений.То, что вы пытаетесь сделать, неосуществимо.почему вы не используете вместо этого POST для связывания объекта JSON вместе с запросом?

2 голосов
/ 31 мая 2013

Я предлагаю более расширенный пример.

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

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
0 голосов
/ 03 апреля 2012

GET-запрос не может использовать любую сущность.Вместо этого используйте методы POST или PUT (предоставляется запрос на вставку или обновление).В противном случае используйте стандартный способ передачи атрибутов в URL.

...