2011-09-09 6 views
2

J'essaie d'exposer un champ dynamique (transitoire) dans mes modèles via renderJson(), mais ça ne fonctionne pas. Voici un exemple:Jouez! framework renderJson n'expose pas de champs particuliers

@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. 
    } 

Un appel à renderJson (Room.findById (2)) rend cela comme une réponse:

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

Le champ resource_uri manque. L'annotation @Expose semble ne rien faire. Et je ne peux pas voir la déclaration de renderJson puisque le framework génère tout le code par des annotations.

Répondre

1

Jouez! utilise Gson. Il ne sérialise pas les champs transitoires.

Jetez un oeil à https://sites.google.com/site/gson/gson-user-guide#TOC-Object-Examples

J'aime Gson parce qu'il est livré avec Play! hors de la boîte. Vous pouvez construire votre propre, adaptateur, quelque chose comme:

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!! 
    } 
} 

Inscrivez-sérialiseur:

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

Et utiliser la gson spécifiant la classe que vous souhaitez sérialiser:

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

Existe-t-il un moyen de sérialiser les champs transitoires? le resource_uri n'est pas vraiment quelque chose que je veux persisté à la base de données car ce sont simplement des méta-données utilisées pour l'interface REST. – sw00

+0

En creusant plus loin, j'ai découvert que Gson ne peut pas sérialiser les propriétés. Du tout. C'est parce qu'il utilise la réflexion pour trouver les champs, apparemment. Quelles alternatives puis-je regarder qui a cette fonctionnalité? FlexJSON? – sw00

+0

Vous pouvez le faire avec Gson, j'ai posté un exemple d'un adaptateur personnalisé dans ma réponse. –

1

Il semble y avoir une divergence dans vos déclarations sur le terrain, vous avez

@Transient 
@Expose 
public String resource_uri; 

Pourtant, vous avez également

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

Cela suggère que votre champ resource_uri est toujours nulle?

+0

Mais ce n'est pas nul, il apparaît dans le terminal lorsque I * System.out.println (u.resource_uri); *. Il apparaît comme "/ api/room/2" Je peux voir comment mon commentaire peut être confus cependant, "l'uri est évalué dynamiquement" par opposition à être récupéré directement comme un champ ORM persistant. – sw00

1

Jouer framework 2.0 utilise jackson pour créer une chaîne json. Utilisez l'annotation @JsonIgnore sur les champs, que vous ne voulez pas exposer

Questions connexes