2011-09-09 6 views
2

私はrenderJson()を介して私のモデルで動的(一時的)フィールドを公開しようとしていますが、動作しません。ここでは例です:再生!フレームワークrenderJsonは特定のフィールドを公開しません

@Entity 
public class Room extends Model { 

    public String name; 
    public String code; 
    @Transient 
    public List<Booking> bookings; 

    @Transient 
    @Expose 
    public String resource_uri; 

    public Room(String name, String code) { 
    this.name = name; 
    this.code = code; 
    } 

    public List<Booking> getBookings() { 
    return Booking.find("byRoom", this).fetch(); 
    } 

    public String getResource_uri(){ 
    return "/api/room/" + this.id; //the uri is evaluated dynamically. 
    } 

renderJson(Room.findById(2))への呼び出しは、応答としてこれをレンダリング:

{"name":"Room B","code":"R-B","id":2} 

resource_uriフィールドが欠落しています。 @Exposeアノテーションは何もしないようです。フレームワークはアノテーションですべてのコードを生成するので、私はrenderJsonの宣言を見ることができません。まだ

@Transient 
@Expose 
public String resource_uri; 

を持って、自分のフィールド宣言の不一致があるようです

答えて

1

再生! Gsonを使用します。それは一時的なフィールドをシリアル化しません。

それはプレイが付属しているので、私はGsonが好きhttps://sites.google.com/site/gson/gson-user-guide#TOC-Object-Examples

を見てみましょう!箱から出してください。登録シリアライザ

public class RoomAdapter implements JsonDeserializer<Room>, JsonSerializer<Room> { 
    public Room deserialize(JsonElement json, Type type, JsonDeserializationContext context){ 
     // Parse the Json to build a Room 
    } 

    public JsonElement serialize(Room room, Type type, JsonSerializationContext context){ 
     // Insert magic here!! 
    } 
} 

: あなたは、のようなものを自分自身、アダプタを構築することができます

Gson gson = new GsonBuilder().registerTypeAdapter(
      Room.class, new RoomAdapter()).create(); 

をそして、あなたがシリアライズするクラスを指定gsonを使用します。

String jsonRoom = gson.toJson(aRoom, Room.class); 
Room aRoom = gson.fromJson(jsonRoom, Room.class); 
+0

一時的フィールドをシリアル化する方法はありますか? resource_uriは実際にはRESTインターフェースに使用されるメタデータであるため、データベースに永続化したいものではありません。 – sw00

+0

さらに詳しく調べると、私はGsonがプロパティをシリアル化できないことを発見しました。まったく。明らかにフィールドを見つけるために反射を使用するからです。 この機能は、どのような方法で見ることができますか? FlexJSON? – sw00

+0

あなたはGsonでそれを行うことができます、私は私の答えにカスタムアダプターの例を掲載しました。 –

1

、あなたも

public String getResource_uri(){ 
    return "/api/room/" + this.id; //the uri is evaluated dynamically. 
} 

を持ってこれはあなたのresource_uriフィールドが永遠にnullであることを示唆しているのでしょうか?

+0

しかし、それはnullではなく、I * System.out.println(u.resource_uri); *のときに端末に表示されます。 これは "/ api/room/2"と表示されます。私は、永続的なORMフィールドとして直接検索されるのではなく、 "uriは動的に評価されます" – sw00

1

プレイフレームワーク2.0はjacksonを使用してjson文字列を作成します。公開したくないフィールドで@JsonIgnoreアノテーションを使用する

関連する問題