2011-05-26 4 views
6

Je suis en train de consommer un tableau de JSON j'ai créé en utilisant JavaScript, mais le tableau est jamais lié dans mon contrôleurConsommer JSON en jeu! contrôleur cadre

Voici le code JavaScript que j'utilise pour appeler mon action du contrôleur

$.post("/produits_ajax",{filterParams:[{name:"milk", value:"chevre"}, {name:"pate", value:"molle"}]}, 
function(data){ 
    $('.dynamicContent').html(data); 
slideProducts(); 
// initialize scrollable 
$(".scrollable").scrollable(); 

}); 

Mon routes fichier entrée

POST  /produits_ajax  Application.produitsAjax 

Voici comment je le reçois dans ma pièce! manette. J'utilise jouer 1.1 et le JsonArray est de com.google.gson.JsonArray

public static void produitsAjax(JsonArray filterParams) { 
    if(filterParams != null) 
     Logger.debug("Le Json: " + filterParams.toString()); 
    else 
     Logger.debug("filterParams is null"); 

    render(); 
} 

Comme vous pouvez l'imaginer, je reçois toujours « filterParams est nulle » dans ma console (je ne serais pas si je tordais ce n'était pas)

C'est très basique jusqu'à présent je veux juste lier le tableau généré dans JS à mon JsonArray. Play! Framework a une excellente documentation mais pour une raison quelconque, il y a très peu de choses sur ce sujet particulier.

Si quelqu'un peut faire la lumière sur cette Il serait très apprécié

Répondre

17

Il vous suffit de créer une classe TypeBinder d'ajouter la capacité de liaison JsonObject jouer!. En fait, c'est assez facile à réaliser dans Play 1.2. Voici la classe complète:

@Global 
public class JsonObjectBinder implements TypeBinder<JsonObject> { 

    @Override 
    public Object bind(String name, Annotation[] annotations, String value, Class actualClass, Type genericType) throws Exception { 
     return new JsonParser().parse(value); 
    } 

} 

C'est tout! Avec l'annotation @Global, Play le trouvera au moment du chargement et l'enregistrera avec les autres classeurs. Je l'utilise dans mon contrôleur avec la signature suivante:

public static void handleJsonBody(JsonObject body) { 
    ... 
} 

Le corps sera automatiquement analysé par Play. Vous pouvez faire la même chose pour JsonArray afin de prendre en charge votre cas particulier.

4

Vous avez 2 options:

  • simple: passer le paramètre en tant que chaîne et dans le contrôleur Parse à Json
  • complexe: créer votre propre classeur en utilisant TypeBinder
+0

KISS travaille généralement bien pour moi. J'ai donc fini par passer un simple String comme ceci: filterParams: "milk = chevre & pate = molle" et l'analysant dans le contrôleur en utilisant la méthode String.split(). – Alain

+0

Merci pour votre aide Pere – Alain