【问题标题】:422 Unprocessable Entity on Restlet ClientProxy and GAE Server422 Restlet ClientProxy 和 GAE 服务器上无法处理的实体
【发布时间】:2015-05-26 06:43:22
【问题描述】:

我有一个一个单独域上的前端应用程序,它与另一个域上的 Restlet 后端通信。到目前为止,CORS 工作正常,唯一的问题是 bean 序列化。

当我检查请求时,它有这个Accept 类型:application/x-java-serialized-object+gwt

但是由于某种原因,我不知道后端何时在 localhost 上运行,我的 GWT 应用程序在向/从后端(在 localhost)发送/接收数据时工作正常,但是当后端是部署在 GAE 云(即appspot.com)然后事情就坏了。它抛出422 Unprocessable Entity

有什么办法可以解决上述问题?

我认为这是一个 Restlet 框架错误(我不确定)。现在我想做的只是简单地摆脱序列化的 GWT 处理,并在 GWT ClientProxy 端使用 JSON 或 XML(application/json 或 application/xml),这可能吗?

这样我们拥有的同一个应用程序应该可以工作:

StuffResourceProxy stuffResource = GWT.create(StuffResourceProxy.class);
         stuffResource.getClientResource().setReference("http://path.to/resource");
         stuffResource.createStuff(model, new Result<Stuff>() {
                @Override
                public void onFailure(Throwable throwable) {
                   // handle error
                }
                @Override
                public void onSuccess(Stuff stuff) {
                    // do thing with stuff
                }
            });

更新:

这是我尝试过的,添加:

stuffResource.getClientResource().getClientInfo().getAcceptedMediaTypes()
                        .add(new Preference<MediaType>(MediaType.APPLICATION_JSON));

GWT 客户端能够发送数据并且服务器能够存储它,但是从服务器到 GWT 客户端不起作用。

从请求头中可以看出GWT应用发送的Content-Type类型是application/x-java-serialized-object+gwt有没有办法强制Restlet ClientProxy改为发送application/json

但是现在服务器可以在服务器端处理application/x-java-serialized-object+gwt POJO,问题是客户端无法转换来自服务器的application/json 响应。

【问题讨论】:

    标签: java google-app-engine gwt restlet


    【解决方案1】:

    没有明显的理由停止在客户端和服务器之间使用 GWT 序列化。我可以隔离一个示例代码,我很乐意调试它。

    在向您展示一种检索 json 的方法之前,只需几句话。 GWT 版本有一个扩展名为 org.restlet.ext.json(参见http://restlet.com/technical-resources/restlet-framework/guide/2.3/editions/gwt/json),它提供了一个 JsonRepresentation 类,还提供了一种简单处理 JSON 对象的方法。主要区别在于这样做,您将只能访问 GWT 库提供的 Json 对象(例如 JSONArray、JSONObject),而不能直接访问您自己的 bean。这是一项相当艰巨的任务,需要在编译时动态编写从有效负载到 bean 的反序列化代码。此任务已针对 GWT 序列化格式完成,因为大部分工作已由 GWT 库提供。我可以向您保证,其他部分并不容易,请参阅https://github.com/restlet/restlet-framework-java/blob/master/modules/org.restlet/src/org/restlet/rebind/ClientProxyGenerator.java.gwt

    话虽如此,如果你想发送 GWT 序列化的有效载荷,并接收 json,你可以这样做:

    • 更新带注释的接口,以便接收作为字符串的负载。
    • 将 org.restlet.client.ext.json 扩展导入到您的项目中
    • 为任何客户端资源实例指定媒体类型首选项
    • 使用字符串值手动实例化 JsonRepresentation

    例如

    注释界面:

    @Put
    public void store(Contact contact, Result<String> callback);
    

    module.gwt.xml 的更新

    <inherits name="org.restlet.JSON" />
    

    媒体类型偏好

    stuffResource.getClientResource().accept(MediaType.APPLICATION_JSON);
    

    响应消耗(详细):

     public void onSuccess(String response) {
         try {
            JsonRepresentation jRep = new JsonRepresentation(response);
            dialogBox.setText("Update contact"
                      + jRep.getJsonObject().get("lastName"));
         } catch (IOException e) {
         }
    

    希望对你有帮助。

    【讨论】:

    • 谢谢蒂埃里,显然我们已经能够解决这个问题,只需更新到 GWT 2.7.0 并使用最新的 Restlet 工件(虽然我们无法确定问题,但它得到了修复.)。正如@Restlet twitter 转发的那样,我们基于 GWT 的 GAE 应用程序现在在使用 GWT 序列化类型从前端到后端的通信方面运行良好。
    猜你喜欢
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    相关资源
    最近更新 更多