Restlet ClientProxy 和 GAE 服务器上的 422 Unprocessable Entity

422 Unprocessable Entity on Restlet ClientProxy and GAE Server

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

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

但是由于某些原因,我不知道后端何时在 localhost 上运行,我的 GWT 应用程序在 sending/receiving 数据 to/from 后端运行良好(在本地主机上),但是当后端部署在 GAE 云中(即 appspot.com)时,事情就会崩溃。它抛出 422 Unprocessable Entity

上述问题的解决方案是什么?

我认为这是一个 Restlet 框架错误(我不确定)。现在我现在要做的是简单地停止序列化 GWT 处理,然后在 GWT ClientProxy 上使用 JSON 或 XML(application/jsonpplication/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 响应。

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

在向您展示检索方法之前简单说几句 json。 GWT 版本有一个名为 org.restlet.ext.json 的扩展(请参阅 http://restlet.com/technical-resources/restlet-framework/guide/2.3/editions/gwt/json) which provides a JsonRepresentation class, and provides also a mean to simple handle JSON objects. The main difference is that by doing so, you will only have access to the Json objects provided by GWT library (such as JSONArray, JSONObject), not to your own bean directly. This is a quite difficult task, that require to write dynamically, at compilation time, the deserialization code from the payload to the beans. This task has been done for the GWT serialization format, because most part of the job were already provided by the GWT library. I can assure you the other part is not very easy, see 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) {
     }

希望对您有所帮助。