Dave
Dave

Reputation: 618

Passing a map to Grails JSON view gson template can't pass values everything is null

The following action:

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

In conjunction with the following addMembers.gson file

model {
    Map result
}

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

Gets a null pointer exception: java.lang.NullPointerException: Cannot get property 'message' on null object

I have things working well in other actions where I respond domain objects but the client side needs a message if I catch an exception and it really didn't seem worth it to create an arbitrary pogo when [message:"",members:[]] could do the same amount of work as an arbitrary extra file and an extra 5-10 lines of code.

Update 1 I tried replacing Map with an arbitrary ResultHolder class to placate any strict typing that might have been in play.

That didn't help

Update 2 In my .gson file I replaced

json{ 

with

json g.render(result){

And that gets me null output instead of null pointers.

Equally unacceptable.

Update 3 In order to try to assess how to interact with gson template without depending on ajax posts and database interaction I make the following arbitrary action:

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

and an arbitrary gson file:

model{
    Map jsonDebug
}

json{
    says jsonDebug.message
}

This allows me to make changes faster to see what is going wrong. I'm trying calling in other ways except respond now but nothing works.

It's as if JSON views are strictly for domain objects and nothing else.

Upvotes: 2

Views: 1924

Answers (1)

Dave
Dave

Reputation: 618

It turns out that I wasn't that very far off when I started. The problem was:

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

Which is the predominant example used at http://views.grails.org/latest/

When I changed to:

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

It worked exactly how I wanted it to.

Upvotes: 3

Related Questions