有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java GWT在发送前在JSON中序列化POST参数

我正在尝试从GWT客户端调用REST服务器。服务器不在我的控制之下,我只为客户端使用GWT。该服务希望接收一个JSON,该JSON将被Jackson反序列化,并映射到如下Java bean:

public DTO {
    String username;
    String password;
    /*...*/
}

因此,在我的GWT项目中,我创建了这个类:

导入com。谷歌。gwt。json。客户JSONObject; 导入com。lh。克莱特。客户桂。util。cltelabelproperty

public class DTO extends JSONObject {
    String username;
    String password;
    /*...*/
}

我正试图通过这种方式发送一个POST请求:

    DTO dto= new DTO();
    dto.setUsername(username);
    dto.setPassword(password);

    RequestBuilder b = new RequestBuilder(RequestBuilder.POST, url);
    b.setHeader("content-type", "application/x-www-form-urlencoded");
    /***** ERROR *************/
    String data = dto.toString(); // JSONObject.toString(), no ovveriding
    /*************************/
    b.setRequestData(data);
    b.setCallback(new MyCallback<DTO>());
    try {
        b.send();
    } catch (RequestException e) {
        e.printStackTrace();
    }

但是,toString方法不会生成预期的JSON,而是生成字符串“{}”。我哪里做错了? 我还尝试了com。谷歌。gwt。json。客户dev.JsonObject,但它不会改变结果


共 (2) 个答案

  1. # 1 楼答案

    在通过线路发送之前,必须先将JSO对象串接起来:

    String data = JsonUtils.stringify(dto);
    

    此函数在2.7.0-SNAPSHOT中可用,对于2.6.1,您必须创建自己的JSNI方法

    String data = stringify(dto);
    
    private native String stringfy(JavaScriptObject jso) /*-{
      return JSON.stringify(obj);
    }-*/;
    
  2. # 2 楼答案

    如果你的后端使用Jackson,你应该试试gwt-jackson。 如果可以访问源代码,就可以使用任何DTO甚至服务器bean

    你这样声明你的地图绘制者:

    public static interface DTOWriter extends ObjectWriter<DTO> {}
    

    然后:

    DTOWriter dtoWriter = GWT.create(DTOWriter.class);
    String data = dtoWriter.write(dto);
    

    顺便说一句,您的内容类型头不应该是application/json