こんにちはバックボーン忍者、
バックボーンを使うのはこれが初めてです。私の機能 (より大きなアプリの一部) では、バックボーン ビュー vA があり、モデル mA (あるべき姿) に支えられており、サーバー側は Spring MVC にあり、Spring コントローラー メソッドに @RequestBody と @ResponseBody のアノテーションが付けられています。Jackson は Spring で問題なく動作しています。
さて、アプリでは、
Backbone.Model
|_ BaseModel (custom base model for our app)
|_ mA (my model)
mA には独自のエンドポイントがあり、バックボーンは、PUT リクエストを作成するときにそれを正常に呼び出します。つまり、View vA から送信ボタン イベント ハンドラーから save() を呼び出すと、次のようになります。
this.model.save({
success : function(){
alert('Request submitted successfully');
},
error : function(){
alert('Something awful happened.');
}
});
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.
},
}
スプリング コントローラの方法:
@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;
}
また、save 呼び出しを行う直前に、いくつかのモデル属性を変更します。これは、サーバー側の DTO の構造が次のように異なるためです。
this.model.unset("abc",{ silent: true });
this.model.set( { abc: {id : "2",xyz:{ ... //more code } );
問題は、save() を呼び出すと PUT 要求が生成され、Spring エンドポイント ハンドラーが正常に呼び出されることですが、応答コード 200 が返されます (これは私が期待することです)。ただし、Firebug で呼び出しをトレースすると、onSyncError メソッドに入ります。エラーメッセージが表示されます(「デフォルト」のケースのため)。
バックボーンのドキュメントには、「JSON 応答を返すときは、サーバーによって変更されたモデルの属性を送信し、クライアントで更新する必要があります」と記載されています。まあ、最後の画面の 1 つであるクライアント側のモデルを更新する必要はありません。ユーザーに成功/エラーを伝え、メイン ページ/ダッシュボードにリダイレクトするだけで済みます。
もう少し調べてみたところ、コード 200 のようです。応答が不十分なためです。同期が失敗する原因となる JSON 解析エラーが発生している可能性があります。
Firebug で応答を確認したところ、応答 JSON は {"msg":"Success"} のようになっています。
それで、何がうまくいかないのでしょうか?