即使在响应代码200之后,主干同步错误

tri*_*ani 8 javascript spring spring-mvc backbone.js

Hello Backbone ninjas,

这是我第一次使用Backbone - 所以请原谅我的"noob".在我的功能(一个更大的应用程序的一部分)中,我有一个Backbone View vA,由一个模型mA(应该是)支持,服务器端在Spring MVC中,带有@RequestBody和@ResponseBody的带有注释的Spring控制器方法.我让杰克逊在春天工作得很好.

现在,在应用程序中,

Backbone.Model
 |_ BaseModel (custom base model for our app)
   |_ mA (my model)
Run Code Online (Sandbox Code Playgroud)

mA有自己的端点,当发出PUT请求时,Backbone成功调用它,即当我从View vA的提交按钮事件处理程序调用save()时,如下所示:

this.model.save({

            success : function(){

                    alert('Request submitted successfully');


            },

            error : function(){
                alert('Something awful happened.');
            }
Run Code Online (Sandbox Code Playgroud)

});

我们的BaseModel具有以下内容:

define([], function() {



window.BaseModel = Backbone.Model.extend({
 ......


});

onSyncError : function(model, response) {
        switch (response.status) {
        case 403:
        [...//some more code ]
        default:
            alert(bundle.getDefault('HTTP_RESP_OTH') + response.status);
        }
    },

    onSyncSuccess : function(model, response) {
        alert('Sync done! ');
    },

    sync : function(method, model, options) {
        options.error = this.onSyncError;
        Backbone.sync.call(this, method, model, options);
        ....//some more stuff.      
    },

}
Run Code Online (Sandbox Code Playgroud)

弹簧控制器方法:

@RequestMapping(value="/resource/xyz/{id}.json", method = RequestMethod.PUT, consumes     = {"application/json"}
, produces = {"application/json"})
@ResponseBody
public Map<String,String> methodX(@RequestBody XyzDTO  xyzDTO){
....
map.put("msg", "success");

return map;
}
Run Code Online (Sandbox Code Playgroud)

此外,在我进行保存调用之前,我修改了一些Model属性,因为服务器端DTO具有不同的结构,如下所示:

this.model.unset("abc",{ silent: true });
this.model.set( { abc: {id : "2",xyz:{ ... //more code } ); 
Run Code Online (Sandbox Code Playgroud)

问题是,调用save()会生成一个PUT请求并成功调用Spring端点处理程序,但我得到一个响应代码200(这是我所期望的),但是当我使用Firebug跟踪调用时,它会进入onSyncError方法并给我一个错误信息(由于其中的"默认"情况).

Backbone文档说:"当返回JSON响应时,发送已经由服务器更改的模型属性,并且需要在客户端上更新".好吧,我不需要在客户端更新模型,它是最后一个屏幕之一,我只需告诉用户成功/错误并将其重定向到主页面/仪表板.

我读了一些,似乎代码200因为响应不充分 - 可能存在JSON解析错误导致同步失败.

我检查了Firebug中的响应,响应JSON看起来像{"msg":"Success"}.

那么,可能出现什么问题?

bre*_*dev 9

Backbone.Model.save()期望服务器的响应是模型值的更新散列.如果您的回复类似{"msg":"Success"},Backbone可能无法与您的模型同步.基本上,它将您的HTTP 200 JSON响应解释为模型的属性,并尝试相应地同步模型.

您可以尝试1)使Spring控制器路径返回JSON-ified模型响应,2)返回带有空响应体的plain 200或3)编写自定义解析方法,查找具有{"msg":"Success"}格式的响应并以不同方式响应.

  • 一个空的响应体仍将调用错误处理程序,但"{}"的响应将不会 (3认同)

tri*_*ani 1

谢谢你的时间。我终于能够通过使用 $.ajax 发出 PUT 请求来解决这个问题,从而绕过整个 Backbone 同步问题。我的 ajax 回调中的成功处理程序处理响应,并且不再有同步错误(因为它无论如何都没有被调用):)