2014-01-07 32 views
6

ドメインクラスPersonをgrailsアプリケーションに用意しました。コンテキストによっては別のフォーム(JSON)で出力する必要があります。Grails - 既に登録されているオブジェクトマーシャラの登録を解除するには

1つのコンテキストでは、2つのフィールド(IDと名前など)だけをレンダリングする必要があります。別の文脈では、私はもっと多く(ID、名前、信任状、年齢など)をレンダリングしたい。私は使用直後に特定のマーシャルを登録解除することが可能かどうか疑問に思っています。私は人のために2つの空のサブクラスを作成し、それぞれに登録された別々のマーシャラーを持つことができ:

------------------------------------------------------------- 

// context #1 
JSON.registerObjectMarshaller(Person) { 
    ... output just id and name 
} 

render myPerson as JSON 

JSON.unregisterObjectMarshaller(Person) // how do i do this? 

------------------------------------------------------------- 

// context #2 
JSON.registerObjectMarshaller(Person) { 
    ... output all fields 
} 

render myPerson as JSON 

JSON.unregisterObjectMarshaller(Person) // how do i do this? 

------------------------------------------------------------- 

注:私が探しているものを基本的に

は次のようなものです。 のコンテキスト番号が増えると、ダミーサブクラスの数も増えます。これは非常に汚れています。

答えて

17

「交換」マーシャラーの代わりに、名前付き設定を使用したいと思うかもしれません。あなたは、(Bootstrap.groovyのように)どこかすっきりクラス/ユーティリティにこれを包むことができますが、実行します。

JSON.createNamedConfig('thin') { 
    it.registerObjectMarshaller(Person) { Person person -> 
     return [ 
      id: person.id, 
      name: person.name, 
     ] 
    } 
} 

JSON.createNamedConfig('full') { 
    it.registerObjectMarshaller(Person) { Person person -> 
     return [ 
       id: person.id, 
       name: person.name, 
       age: person.age 
     ] 
    } 
} 

そして、コントローラで、あなたが表示するように整列化、人のどのスタイルを選択することができます。

// Show lots of stuff 
JSON.use('full') { 
    render people as JSON 
} 

または

// Show less stuff 
JSON.use('thin') { 
    render people as JSON 
} 
+1

+1これは美しいです。そしてとてもきれいです。ありがとうございました。私はそれを入れて、それがどのように行ったかを伝えます。 – techfoobar

+0

うまくいった。ありがとうございました。 :) – techfoobar

+0

それはうまくいってうれしい、うれしい。 –

関連する問題