JavaScriptアプリケーションのJSONデータを提供するために使用されるRESTfulインターフェイスを開発しています。JSONとネストされたGrailsドメインオブジェクトのバインド
私はGrails 1.3.7を使用し、永続性のためにGORM Domain Objectsを使用します。私は、ネストされたドメインをマーシャリングをサポートするためのカスタムJSONマーシャラーを実装したサンプルドメインオブジェクトです。ここ
オブジェクト:
class SampleDomain {
static mapping = { nest2 cascade: 'all' }
String someString
SampleDomainNested nest2
}
と
class SampleDomainNested {
String someField
}
がSampleDomainリソースがURL/RS /サンプルの下で公開されています/ so/rs/sample/1はIDが1のSampleDomainオブジェクトを指します
私のカスタムjsonマーシャラー(GET on/rs/sample)を使用してリソースをレンダリングすると、/1)、次のデータが得られます。
{
"someString" : "somevalue1",
"nest2" : {
"someField" : "someothervalue"
}
}
これはまさに私が望むものです。
問題が発生しました。PUT経由で同じデータをリソース/ rs/sample/1に送信しようとしました。
ドメインオブジェクトにjsonデータをバインドするには、要求を処理するコントローラは、def domain = SampleDomain.get(id)
とdomain.properties = data
を呼び出します(dataは非整列オブジェクトです)。
"someString"フィールドのバインディングはうまくいきますが、ネストされたデータを使用してネストされたオブジェクトが作成されないため、プロパティ "nest2"がnullであるというエラーが発生します。
私はすでにPropertyEditorSupport
とStructuredPropertyEditor
のカスタムを実装しようとしましたが、クラスのエディタを登録しました。
不思議なことに、エディタはネストされていない値を指定すると呼び出されるだけです。だから私はPUTを介してサーバに以下を送信するときに(任意の意味を成さない;))
{
"someString" : "somevalue1",
"nest2" : "test"
}
少なくともプロパティエディタが呼び出されます。
私はGrailsDataBinder
のコードを見ました。 「
{
"someString" : "somevalue1",
"nest2.somefield" : "someothervalue"
}
が、これは私ドン以来、私を助けていません:私は、協会のプロパティを設定すると、関連性のパスを指定する代わりに、マップを提供することで動作するように思われることがわかったので、次は同様に動作しますカスタムJavaScriptをJSONオブジェクトシリアライザに実装したい
ネストマップを使用してGrailsデータバインディングを使用することはできますか?それとも、私は実際に各ドメインクラスのために手でそれを実装するヒーブですか?
{ class:"SampleDomain", someString: "abc",
nest2: { class: "SampleDomainNested", someField:"def" }
}
私が知っている、それは出力がそれが生成する異なる入力を必要とします。
どうもありがとう、
マーティン
カスタムjsonアンマーシャラーもありますか? – fixitagain
いいえ、私はカスタムjsonアンマーシャラーを持っていません。私はrequest.JSONを使ってリクエストを解析します。私が望むのは、Mapからドメインオブジェクトを作成することと、ドメインオブジェクトをIDでロード/マッピングすることの両方をサポートするプロパティエディタです。 – frow
このプラグインを試しましたか:http://www.grails.org/plugin/json-rest-api –