2012-04-03 4 views
4

Ich versuche, Werte in einer GET-Anforderung an ein POJO zu binden.Verwenden von @Consume mit GET-Anforderung in Jersey Rest

Die Werte sind Parameter in einer HTTP GET-Anfrage. Ich verwende JSONP, um die Parameter zu übergeben, aber es sieht so aus, als ob JSONP das JSON-Objekt in die Request-Zeile hochschiebt, so dass es nicht wirklich ein JSON-Objekt ist, das gesendet wird, sondern nur Wertpaare auf der URL.

Kann ich die Werte in meiner GET-Anfrage einem POJO zuordnen? Jersey gibt die folgende Ausnahme, wenn ich versuche, verbindlich

Eine HTTP-GET-Methode, öffentliche void handleJSONP (MyPojo), sollte keine Entität konsumieren.

Der Bindungscode sucht im Anfragetext, aber es existiert nicht, weil es eine GET-Anfrage ist. Gibt es eine andere Möglichkeit, die Werte in der Anforderung zu binden, ohne einen @QueryParam-Eintrag für jede Anforderung manuell einfügen zu müssen?

Dank

Antwort

7

konnte ich lösen dies durch den Einsatz von @com.sun.jersey.api.core.InjectParam Jersey

public JSONWithPadding doSomething(@InjectParam final MyPojo argPojo) 

Dann sieht die Pojo wie diese

public class MyPojo 
{ 
/** */ 
@QueryParam("value1") 
private String value1; 

/** */ 
@QueryParam("value2") 
private String value2; 

/** */ 
@QueryParam("value3") 
private List<String> value3; 
+0

Kann ich das gleiche Ergebnis mit @BeanParam erreichen? Wenn nicht, was sind Abhängigkeiten für die Verwendung von @InjectParam? Da ist es nicht in Jersey-Container-Servlet enthalten. –

3

HTTP GET durch Spezifikation enthält die Parameter in der URL - daher ist es Wert-Paare nur akzeptiert. Also, was Sie versuchen, ist nicht machbar. Warum verwenden Sie nicht stattdessen einen POST, um ein JSON-Objekt zusammen mit der Anfrage zu bündeln?

+1

i JSONP für Cross-Domain benötigen, so dass es sehr möglich ist. Die Möglichkeit, von der GET-Anfrage an ein POJO zu binden, ist jedoch möglicherweise nicht möglich. – cduggan

+0

das ist was ich meine, nicht jsonp - das ist in Ordnung. Sorry für das Missverständnis ... – stzoannos

+0

sicher kein Problem – cduggan

0

GET-Anforderung kann keine Entität konsumieren. Verwenden Sie stattdessen POST- oder PUT-Methoden (sofern eine Anfrage zum Einfügen oder Aktualisieren vorliegt). Andernfalls gehen Sie mit Standard-Art der Übergabe von Attributen in URL.

2

ich eine ausgedehntere Beispiel vorschlage.

jQuery Client-Seite:

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

auf dem Server

@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(){} 

    } 

Chromkonsole Ergebnis

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 
Verwandte Themen