2 votes

Passage d'une carte à la vue JSON de Grails : le modèle gson ne peut pas passer de valeurs ; tout est nul.

L'action suivante :

def addMembers(){
    Map result = [message:"successful"]
    try {
        def group = Group.get(params.id)
        def json = request.JSON
        def users = json.users.collect{Usr.get(it.id)}
        result.members = groupService.addMembers(group,users)
    }catch(Exception e){
        message = "Exception $e"
        result.message = message
        response.setStatus(hsr.SC_METHOD_NOT_ALLOWED)
    }
    respond result, [model:[result:result]]
}//eo addMember

En conjonction avec le fichier addMembers.gson suivant

model {
    Map result
}

json{
    message result.message
    members g.render(template:"simpleMember", collection: result.members, var:'member')
}

Obtient une exception de pointeur nul : java.lang.NullPointerException : Impossible d'obtenir la propriété 'message' sur un objet nul.

J'ai des choses qui fonctionnent bien dans d'autres actions où je réponds à des objets du domaine, mais le côté client a besoin d'un message si j'attrape une exception et il ne semblait vraiment pas utile de créer un pogo arbitraire quand [message :"",members :[]] pourrait faire la même quantité de travail qu'un fichier supplémentaire arbitraire et 5-10 lignes de code supplémentaires.

Mise à jour 1 J'ai essayé de remplacer Map par une classe ResultHolder arbitraire afin d'apaiser toute typologie stricte qui aurait pu être en jeu.

Cela n'a pas aidé

Mise à jour 2 Dans mon fichier .gson, j'ai remplacé

json{ 

avec

json g.render(result){

Et ça me donne une sortie nulle au lieu de pointeurs nuls.

Tout aussi inacceptable.

Mise à jour 3 Afin d'essayer d'évaluer comment interagir avec le modèle gson sans dépendre des messages ajax et de l'interaction avec la base de données, je fais l'action arbitraire suivante :

def jsonDbug(){
    def result = [message:"hi"]
    respond result, [model:[jsonDbug:result]]
}

et un fichier gson arbitraire :

model{
    Map jsonDebug
}

json{
    says jsonDebug.message
}

Cela me permet de faire des changements plus rapidement et de voir ce qui ne va pas. J'essaie d'appeler d'autres façons que de répondre maintenant, mais rien ne fonctionne.

C'est comme si les vues JSON étaient strictement réservées aux objets du domaine et rien d'autre.

3voto

Dave Points 201

Il s'avère que je n'étais pas si loin du compte quand j'ai commencé. Le problème était que :

respond result, [model:[result:result]]

Quel est l'exemple prédominant utilisé à http://views.grails.org/latest/

Quand j'ai changé pour :

render(view:"addMembers", model:[result:result])

Ça a fonctionné exactement comme je le voulais.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X