【问题标题】:Using @Consume with GET request in Jersey Rest在 Jersey Rest 中使用 @Consume 和 GET 请求
【发布时间】:2012-04-03 12:56:54
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

    标签: jsonp jersey jackson


    【解决方案1】:

    我可以通过使用球衣的@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;
    

    【讨论】:

    • 我不能使用@BeanParam 获得相同的结果吗?如果没有,使用@InjectParam 的依赖项是什么?因为它不包含在 jersey-container-servlet 中。
    【解决方案2】:

    HTTP GET 规范包含 URL 中的参数 - 因此它只接受值对。因此,您尝试做的事情是不可行的。为什么不使用 POST 来将 JSON 对象与请求捆绑在一起?

    【讨论】:

    • 我需要跨域的jsonp,所以非常可行。然而,从 GET 请求绑定到 POJO 的能力可能是不可能的
    • 这就是我所指的,而不是 jsonp - 这很好。很抱歉造成误会...
    【解决方案3】:

    我提出了一个更扩展的例子。

    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
    

    【讨论】:

      【解决方案4】:

      我们知道 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;
      

      【讨论】:

        【解决方案5】:

        GET 请求不能消耗任何实体。 相反,使用 POST 或 PUT 方法(假设请求用于插入或更新)。 否则,请使用在 URL 中传递属性的标准方式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-17
          • 2014-12-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多